我正在尝试使用 ode45 求解一个微分方程,我有一个函数,其中一个参数必须随特定步骤而变化,这是我的函数:
function f=RSJ(y,t,M1,P,M2,E,current)
f=(current/P)-(M1/P)*sin(y)+(M2/P)*sin(y+E);
P
, M1
, M2
&E
是数值常数,current
在几种情况下我应该解决这个微分方程的参数,例如current=0:1:10
我怎么能做这样的事情?
使用闭包(又名匿名或 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
一个快速而肮脏的解决方案。定义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
......