【问题标题】:ODE - Solving Parameter Dependent on Variable [Matlab]ODE - 求解取决于变量的参数 [Matlab]
【发布时间】:2015-06-16 21:11:59
【问题描述】:

假设我有一个像这样的 ODE 函数文件

function xprime = RabbitTemp(t,X) 

% Model of Rabbit Population
% where,
%       Xo = Initial Population of Rabbits
%       X(1) = Population density of Rabbit
%       X(2) = Temperature T (that varies with time) 
%       a = test parameter

%%% ODE
a  = 10;


dx(1) = (X(1))*(1 - a*X(1) - 3*(X(2))));
dx(2) = sin(t);
%%%%%%%

xprime = [dx(1) dx(2)]';

end

但是,如果我希望参数 a 随着温度 X(2) 的变化而变化,正如 ODE 求解器所计算的那样。

我知道我首先必须在 aX(2) 之间创建一些数据并对其进行插值。但在那之后,我不太确定接下来会发生什么。有人能指出我正确的方向吗?

或者还有其他方法吗?

【问题讨论】:

  • 我可以再加两美分吗? 1.你应该预先分配dx作为xprime中的第一件事,然后你可以简单地返回dx而不是复制到xprime。不需要两个相同的不同变量。 2. 如果您的代码变得更大,请考虑定义索引变量,例如ind.pop_density = 1ind.temp=2。从长远来看,它将对您有所帮助。

标签: matlab parameter-passing ode


【解决方案1】:

这真的取决于a的功能,a=f(T)。如果您可以采用f(T) 的导数,我建议您将a 作为另一种状态,例如X(3),然后您可以从xprime 中的X 参数轻松访问它,另外它将帮助Matlab 确定积分期间的适当步长:

function xprime = RabbitTemp(t,X) 

% Model of Rabbit Population
% where,
%       Xo = Initial Population of Rabbits
%       X(1) = Population density of Rabbit
%       X(2) = Temperature T (that varies with time) 
%       X(3) = test parameter

%%% ODE
a  = 10;
Yo = 0.4; %Just some Constant

dx(1) = (X(1))*(1 - X(1)^(a) - Yo*(X(2))));
dx(2) = sin(t);
dx(3) = .... 
%%%%%%%

xprime = [dx(1) dx(2) dx(3)]';

end

第二种方法是为a=f(T)创建一个函数(-handle)并从xprime内部调用它:

function xprime = RabbitTemp(t,X) 

% Model of Rabbit Population
% where,
%       Xo = Initial Population of Rabbits
%       X(1) = Population density of Rabbit
%       X(2) = Temperature T (that varies with time) 
%       a = test parameter

%%% ODE
a  = f_a(t,X);
Yo = 0.4; %Just some Constant

dx(1) = (X(1))*(1 - X(1)^(a) - Yo*(X(2))));
dx(2) = sin(t);
%%%%%%%

xprime = [dx(1) dx(2)]';

end

function a = f_a(t,X)
  return 10;  % You might want to change this. 
end

如果可能,请使用为a 创建另一个状态的第一个变体。

【讨论】:

  • 感谢您的意见。不幸的是,我不知道 aT 之间的实际关系。我所拥有的只是一组数据(尽管我可以尝试拟合该数据..!),即为什么我正在考虑使用 interp1 生成更多数据点,并尝试将其相应地输入到求解器中。嗯!
  • 在这种情况下,我肯定会事先创建一个带有插值的网格,或者像你说的那样,尝试拟合曲线或类似的东西。后者甚至会产生一个可微的函数,所以我会先尝试 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多