在此之前,我不能使用任何内置的ODE解算器。我用显式欧拉方法编码了这个常微分方程系统,但我需要用隐式欧拉方法重写它。如果我只是把"I"换成"I+1"(比如"y(1,I("换成了"y(l,I+1("(,那么答案就大错特错了。
A_init= 4;
B_init= 1.1;
C_init= 4;
y0 = [A_init; B_init; C_init];
h = 20/100;
n = 100;
t0 = 0;
tf = 20;
t = linspace(t0,tf,n);
y = zeros(numel(y0) , n);
y(:, 1) = y0(:);
dAdt= @(a,b) 7.27*(b-a*b+ a-(8.375*10^-5)*a^3);
dBdt= @(b,a,c)(-b-a*b+c)/77.27;
dCdt= @(c,a) 0.4*(a-c);
for i = 1:n-1
y(1,i+1) = y(1,i) +h*feval(dAdt,y(1,i),y(2,i));
y(3,i+1) = y(3,i) +h*feval(dCdt,y(3,i),y(1,i));
y(2,i+1) = y(2,i) +h*feval(dBdt,y(2,i),y(1,i),y(3,i));
end
您的想法是正确的,但请记住,如果将右侧的i
更改为i+1
,则y(1,i+1), y(2,i+1), y(3,i+1)
将出现在方程的两侧。这意味着您实际上必须在每一步中求解y(1,i+1), y(2,i+1)
和y(3,i+1)
。由于三个方程是耦合的,因此必须在每个时间步长使用fsolve
或fzero
求解非线性方程组。
阅读这个问题的答案,它展示了如何在单方程的情况下做到这一点。