Изменение параметров в функции для использования с решателем ODE

Можно ли использовать решатель ODE, такой как ode45, и по-прежнему иметь возможность «изменять» значения параметров в вызываемой функции?

Например, если бы я использовал следующую функцию:

function y = thisode(t, Ic)
% example derivative function

% parameters
a = .05;
b = .005;
c = .0005;
d = .00005;

% state variables
R = Ic(1);
T = Ic(2);

y = [(R*a)-(T/b)+d; (d*R)-(c*T)];

с этим скриптом:

clear all
% Initial conditions
It = [0.06 0.010];
% time steps
time = 0:.5:10;
% ODE solver
[t,Ic1] = ode45(@thisode, time, It);

все работает так, как я ожидал. Однако я хотел бы иметь способ легко изменять значения параметров, но все же запускать несколько итераций решателя ODE с помощью только одной функции и одного скрипта. Однако не похоже, что я могу просто добавить дополнительные термины в решатель ODE, например:

function y = thisode(t, Ic, P)

% parameters
a = P(1);
b = P(2);
c = P(3);
d = P(4);

% state variables
R = Ic(1);
T = Ic(2);

y = [(R*a)-(T/b)+d; (d*R)-(c*T)];

с этим скриптом:

clear all
% Initial conditions
It = [0.06 0.010];
P1 = [.05 .005 .0005 .00005]
% time steps
time = 0:.5:10;
% ODE solver
[t,Ic1] = ode45(@thisode, time, It, [], P1);

не работает. Думаю, я знаю, что это не должно сработать, но я не смог придумать решение. Я также рассматривал оператор if внутри функции, а затем жестко закодировал несколько наборов параметров, которые будут использоваться (например, использовать набор 1, когда P == 1, установить 2, когда P == 2, и т.д.), но это также не сработало как Я не знаю, где назвать набор для использования с ODE. Мы будем очень благодарны за любые советы или предложения о том, как использовать одну функцию и один скрипт с решателем ODE, при этом имея возможность изменять значения параметров.

Спасибо, Майк


person nofunsally    schedule 16.10.2012    source источник
comment
Откройте справку Matlab по ode45, и в разделе «Описание» у вас будет ссылка на справку по параметризации функций, которая, я думаю, вам и нужна.   -  person Bitwise    schedule 16.10.2012


Ответы (1)


Вам придется вызывать функцию по-другому:

[t,Ic1] = ode45(@(t,y) thisode(t,y,P1), time, It);

Функция ode45 предполагает, что все переданные ей функции принимают только t и y. Вышеупомянутый вызов - это стандартный прием, чтобы Matlab прошел P1, а ode45 передавайте его t и y при каждом звонке.

person Rody Oldenhuis    schedule 16.10.2012
comment
Спасибо за пример кода, описание и стандартную ссылку на трюк. Например, до того, как я опубликовал и как предложил Bitwise, я проверил справку ode45, но все еще не мог найти решение. Ваше здоровье. - person nofunsally; 16.10.2012