matlab ode45如何连续更改函数内部的参数

时间:2013-09-27 14:15:53

标签: matlab ode

我正在尝试使用ode45求解微分方程,我有一个函数,其中一个参数必须按特定步骤变化,这是我的函数:

function f=RSJ(y,t,M1,P,M2,E,current)

f=(current/P)-(M1/P)*sin(y)+(M2/P)*sin(y+E);

PM1M2& E是数字常数,current是我应该针对几种情况解决此微分方程的参数,例如current=0:1:10 我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

使用闭包(a.k.a.匿名或lambda函数):

% declare t, y, tspan and y0
% [...]
current = 6e-7 : 1e-8 : 8.5e-7;
for k=1:length(current)
    f = @(y, t, M1, P, M2, E) (current(k)/P)-(M1/P)*sin(y)+(M2/P)*sin(y+E);
    [t{k}, y{k}] = ode45(f, tspan, y0);
end

答案 1 :(得分:0)

快速而肮脏的解决方案。将current定义为全局变量(您需要在基础工作区和函数中执行此操作)并使用for循环,例如

current_vector=1e-7*(6:0.1:8.5);
global current
for k=1:length(current_vector)
    current = current_vector(k);
    [t{k},y{k}]=ode45(f,<tspan>,<y0>)
end

<tspan><y0>替换为适当的值/变量。我假设其他常量是在函数体中定义的,在这种情况下你的函数应该是这样的:

function f=RSJ(t,y)
    global current
    M1 = ... % etc...
    f=(current/P)-(M1/P)*sin(y)+(M2/P)*sin(y+E);
end

顺便说一句,我没有看到你的函数中明确依赖时间t ...