Использование @ или '' для ode45 в Matlab?

Я немного не понимаю, когда использовать ode45 (@functionname, tspan, initialvalues, ...) или ode45 ('functionname', tspan, initial values, ...). Я видел примеры, использующие оба, но иногда один работает, а другой нет.

например [t,y]=ode45(@MM2, tspan, y0,[],k1,k2,k3) работает, а [t,y]=ode45('MM2', tspan, y0,[],k1,k2,k3) - нет.

Спасибо заранее.


person Richard    schedule 10.04.2016    source источник
comment
Чтение документации (help ode45 или doc ode45) - обычный способ ответить на такие вопросы. В сети все еще плавает много старого кода. Указание функции со строками устарело много лет назад (хотя это все еще работает). Использование дескриптора функции более надежно и дает более быстрый код.   -  person horchler    schedule 10.04.2016
comment
Единственный контекст, с которым я столкнулся, когда строка не работает в этом варианте использования, - это когда функция, в данном случае MM2, является локальной или вложенной функцией, так что feval не может ее найти. Мой совет, если можете, всегда используйте дескрипторы функций. Выполнение строки - это устаревшая функция.   -  person TroyHaskin    schedule 11.04.2016


Ответы (1)


Как я понял, вы будете использовать «@», когда функция, которую вы собираетесь интегрировать, находится в другом текстовом файле. Если функция находится в том же текстовом файле, вам не нужно использовать «@».

Например: рассчитаем горизонтальную координату маятника Ван дер Поля.

В файле 1: xdot_van_der_pol.m

function dxdt = xdot_van_der_pol(t, x)
global u;
if size(u,1) == 0
    u = 1
end
dx1 = x(2);
dx2 = u*(1 - x(1)^2)*x(2) - x(1);
dxdt = [ dx1 ; dx2 ];

В файле 2: integration.m

u = 1;
tf = 20;
xo = [2 ; 0];
[t,x]=ode45(@xdot_van_der_pol, [0 tf], xo);
subplot(221); plot(x(:,1), t(:,1)); hold on;
subplot(224); plot(t(:,1), x(:,2)); hold on;
subplot(223); plot(x(:,1), x(:,2)); hold on;

Другой случай - записать все в одном текстовом файле, чтобы вам не пришлось использовать «@» для вызова функции.

person Lucas Gamaleri    schedule 30.10.2018