问题如下,希望添加文字说明
做了欧拉法、RK2和ode45三种算法。
已更新二阶泰勒方法。
function ODESolveTest()
%% 欧拉法求解常微分方程
T = 1;
h = 0.02;
t = 0:h:T;
x = [0;0]; % 初始值
X1(1,:) = x';
for ii = 2:length(t)
dx = Dfun(t(ii),x);
x = x + dx * h;
X1(ii,:) = x';
end
%% 二阶泰勒展开法
x = [0;0]; % 初始值
X2(1,:) = x';
for ii = 2:length(t)
[dx,d2x] = Dfun(t(ii),x);
x = x + h*dx + d2x*h^2/2;
X2(ii,:) = x';
end
%% 二阶RK法
x = [0;0]; % 初始值
X3(1,:) = x';
for ii = 2:length(t)
k1 = Dfun(t(ii-1),x);
k2 = Dfun(t(ii),x+h*k1);
x = x + 0.5*(k1+k2) * h;
X3(ii,:) = x';
end
%% ode45
x = [0;0]; % 初始值
[~,X4] = ode45(@Dfun,t,x);
r = 0.5;
F1 = exp( -r*X1(:,1) - X1(:,2) );
F2 = exp( -r*X2(:,1) - X2(:,2) );
F3 = exp( -r*X3(:,1) - X3(:,2) );
F4 = exp( -r*X4(:,1) - X4(:,2) );
figure
plot(t,F1,'b-.','linewidth',1.5)
hold on
plot(t,F2,'c-.','linewidth',1.5)
plot(t,F3,'r--','linewidth',1.5)
plot(t,F4,'linewidth',1.5)
legend('Euler','Taylor2','RK2','ode45')
xlabel('Time/s')
ylabel('f(t,r)')
title('r = 0.5')
end
function [dx,d2x] = Dfun(t,x)
b = 0.2;
sigma = 0.05;
a = 0.004;
C = x(1);
A = x(2);
dx = zeros(2,1);
dx(1) = b*C + 0.5*sigma^2*C^2 - 1;
dx(2) = -a*C;
j = [ b+0.5*sigma^2*2*C*dx(1) 0
-a 0 ];
d2x = j * dx;
end
结果