Функция MATLAB (устранение ошибки)

#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 not g .

Ответ №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, чтобы разобраться в том, как используются векторы и функции.