我有从流行病传播中得出的微分方程。我想获得数值解。这是方程式,
t 是一个自变量,范围从[0,100]
. 初始值为
y1 = 0.99; y2 = 0.01; y3 = 0;
起初,我打算在matlab中用ode45函数处理这些,但是我不知道如何表达系列和组合。所以我在这里寻求帮助。
**
问题是如何将方程的右边表示为 odefun,它是 ode45 函数中的一个参数。
**
我有从流行病传播中得出的微分方程。我想获得数值解。这是方程式,
t 是一个自变量,范围从[0,100]
. 初始值为
y1 = 0.99; y2 = 0.01; y3 = 0;
起初,我打算在matlab中用ode45函数处理这些,但是我不知道如何表达系列和组合。所以我在这里寻求帮助。
**
**
Matlab 具有计算二项式系数(组合数)的功能,有限级数可以表示为矩阵乘法。我将演示如何处理第一个等式中的总和。请注意算术运算符的元素方式“点”形式的使用。
coefs
计算总和中具有常数系数的行向量:
octave-3.0.0:33> a = 0:20;
octave-3.0.0:34> coefs = log2(a * 0.05 + 1) .* bincoeff(20, a);
变量组合成另一个向量:
octave-3.0.0:35> y1 = 0.99;
octave-3.0.0:36> y2 = 0.01;
octave-3.0.0:37> z = (y2 .^ a) .* ((1 - y2) .^ a) .* (y1 .^ a);
然后总和被评估为内积:
octave-3.0.0:38> coefs * z'
其他金额类似。
function demo(a_in)
X = [0;0;0];
T = [0:.1:100];
a = a_in; % for nested scope
[Xout, Tout ]= ode45( @myFunc, T, X );
function [dxdt] = myFunc( t, x )
% nested function accesses "a"
dxdt = 0*x + a;
% Todo: real value of dxdt.
end
end
怎么样,你只需要从上面的数学中填写 dxdt 吗?数字四舍五入是否重要还有待观察......
编辑:由于 1=y1+y2+y3 约束,存在一个严重的问题。这是否允许,因为您有一个 IVP,其中给出了 3 个初始值和 3 个一阶 ODE?如果该约束是方程式的自然结果,则可能不需要它。