Функция MATLAB (устранение ошибки) - PullRequest
0 голосов
/ 04 октября 2011

У меня есть один файл со следующим кодом:

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, и это явно вызывает проблемы, как видно из ошибки.

Любая помощь будет великолепна. Спасибо.

Ответы [ 3 ]

6 голосов
/ 04 октября 2011

Похоже, вы пытаетесь создать функцию в переменной 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) и т. Д. Для расчета того, что вы хотите.

4 голосов
/ 04 октября 2011

Вы также можете использовать функцию 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)

screenshot

3 голосов
/ 04 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...