Changing parameters within function for use with ODE solver

余生颓废 提交于 2020-01-03 05:47:10

问题


Is is it possible to use an ODE solver, such as ode45, and still be able to 'change' values for the parameters within the called function?

For example, if I were to use the following function:

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)];

with this script:

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

everything works as I would expect. However, I would like a way to easily change the parameter values, but still run multiple iterations of the ODE solver with just one function and one script. However, it does not seem like I can just add more terms to the ODE solver, for example:

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)];

with this script:

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);

does not work. I guess I know this shouldn't work, but I have been unable to come up with a solution. I was also considering an if statement within the function and then hard coding several sets of parameters based to be used (e.g use set 1 when P == 1, set 2 when P == 2, etc) but this also did not work as I don't where to call the set to be used with an ODE. Any tips or suggestion on how to use one function and one script with an ODE solver while being able to change parameter values would be much appreciated.

Thank you, Mike


回答1:


You'll have to call the function differently:

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

The function ode45 assumes all functions passed to it accept only an t and a y. The above call is a standard trick to get Matlab to pass P1, while ode45 will pass it t and y on every call.



来源:https://stackoverflow.com/questions/12906222/changing-parameters-within-function-for-use-with-ode-solver

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!