【问题标题】:matlab ode45 how to change a parameter inside the function continiouslymatlab ode45如何连续更改函数内的参数
【发布时间】:2013-09-27 14:15:52
【问题描述】:

我正在尝试使用 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 我怎么能做这样的事?

【问题讨论】:

  • 我宁愿建议你在数学部分问。

标签: matlab ode


【解决方案1】:

使用闭包(又名匿名或 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

【讨论】:

  • 什么意思? ∂y/∂t = y' = f(t,y),你要解决的问题是求 y(t)。
  • 我发现下面的代码会给我 dy/dt: ydot=y(:,2) ,但是当我尝试这个时,我得到 dy/dt 为 1 电流,我怎样才能得到 dy/ dt 用于不同的电流?
  • 我不确定我是否理解您的要求,但每次迭代都会返回给定电流的 y(t),是的。在这里,我将它们保存在一个单元格数组中,以免擦除上一次迭代的结果。
【解决方案2】:

快速而肮脏的解决方案。将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

&lt;tspan&gt;&lt;y0&gt; 替换为适当的值/变量。我假设其他常量是在函数体中定义的,在这种情况下,您的函数应该如下所示:

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

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

【讨论】:

  • 您的解决方案有效,但是如果我想像这样更改电流怎么办:current=6.00*10^(-7):0.1*10^(-7):8.5*10^(-7 ), & y 也是时间的函数。
  • 我已编辑我的答案以适应 current 的新值。
  • 没有。不,不需要使用全局变量。这不是他们的目的。 current 的值应通过在集成函数f 中声明,作为参数传递给ode45。 @user2822314,请参阅@Simon 的解决方案。
  • @horchler 我同意。我确实说过它“又快又脏”。
猜你喜欢
  • 2016-07-07
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
相关资源
最近更新 更多