#matlab
#matlab
Вопрос:
У меня есть один файл со следующим кодом:
function fx=ff(x)
fx=x;
У меня есть другой файл со следующим кодом:
function g = LaplaceTransform(s,N)
g = ff(x)*exp(-s*x);
a=0;
b=1;
If=0;
h=(b-a)/N;
If=If g(a)*h/2 g(b)*h/2;
for i=1:(N-1)
If=If g(a h*i)*h;
end;
If
Всякий раз, когда я запускаю второй файл, я получаю следующую ошибку:
Неопределенная функция или переменная ‘x’.
То, что я пытаюсь сделать, это интегрировать функцию g между 0 и 1, используя трапециевидные приближения. Однако я не уверен, как обращаться с x, и это явно вызывает проблемы, как видно из ошибки.
Любая помощь была бы отличной. Спасибо.
Ответ №1:
Похоже, что вы пытаетесь создать функцию в переменной g
. То есть вы хотите, чтобы первая строка означала,
«Пусть
g(x)
будет функция, которая вычисляется следующим образом:ff(x)*exp(-s*x)
«,
вместо
«вычислите значение
ff(x)*exp(-s*x)
и введите результатg
«.
Решение
Вы можете создать подфункцию для этого
function result = g(x)
result = ff(x) * exp(-s * x);
end
Или вы можете создать анонимную функцию
g = @(x) ff(x) * exp(-s * x);
Затем вы можете использовать g(a)
, g(b)
, и т.д., чтобы вычислить то, что вы хотите.
Комментарии:
1. Ах, я думаю, это, вероятно, то, что он имел в виду. Перегрузка вызова функции / доступа к массиву затрудняет определение намерения…
2. Кроме того, вы хотите вернуть
If
notg
.
Ответ №2:
Вы также можете использовать функцию TRAPZ для выполнения трапециевидного численного интегрирования. Вот пример:
%# parameters
a = 0; b = 1;
N = 100; s = 1;
f = @(x) x;
%# integration
X = linspace(a,b,N);
Y = f(X).*exp(-s*X);
If = trapz(X,Y) %# value returned: 0.26423
%# plot
area(X,Y, 'FaceColor',[.5 .8 .9], 'EdgeColor','b', 'LineWidth',2)
grid on, set(gca, 'Layer','top', 'XLim',[a-0.5 b 0.5])
title('$int_0^1 f(x) e^{-sx} ,dx$', 'Interpreter','latex', 'FontSize',14)
Ответ №3:
Сообщение об ошибке здесь настолько понятно, насколько оно понятно. Вы не определяете вызываемую переменную x
, поэтому, когда вы ссылаетесь на нее в первой строке своей функции, MATLAB не знает, что использовать. Вам нужно либо определить ее в функции, прежде чем ссылаться на нее, передать ее в функцию, либо определить ее где-нибудь дальше по стеку, чтобы она была доступна при вызове LaplaceTransform .
Поскольку вы пытаетесь численно интегрировать по отношению к x
, я предполагаю, что вы хотите x
принимать значения, равномерно распределенные по вашему домену [0,1]. Вы могли бы выполнить это, используя, например
x = linspace(a,b,N);
РЕДАКТИРОВАТЬ: здесь есть несколько других проблем: во-первых, когда вы определяете g
, вам нужно использовать .*
вместо *
умножения элементов в массивах (по умолчанию MATLAB интерпретирует умножение как матричное умножение). Во-вторых, ваши вызовы g(a)
и g(b)
обрабатываются g
как функция, а не как массив значений функции. Это то, к чему нужно привыкнуть в MATLAB; вместо g(a)
этого вам действительно нужен первый элемент вектора g
, который задается g(1)
. Аналогично, вместо g(b)
, вам нужен последний элемент g
, который задается с помощью g(length(g))
или g(end)
. Если это не имеет смысла, я бы посоветовал взглянуть на базовый учебник MATLAB, чтобы разобраться в том, как используются векторы и функции.