从一阶到二阶调整 Runge-Kutta ODE 求解器
Adapt Runge-Kutta ODE solver from first order to second order
我有一个 Matlab 函数可以对一阶 ODE 进行 Runge-Kutta4k 逼近,我想调整它以适用于二阶 ODE。任何人都可以帮助我开始吗?这是我第一次订购 RK4K 时得到的:
function [y,t,h] = rungekutta4kh(F,y0,a,b,n)
% Euler ODE solver
t = linspace(a,b,n);
h = t(2)-t(1);
y = zeros(n,1);
y(1) = y0;
for i=2:n
s1 = feval(F,t(i-1),y(i-1));
s2 = feval(F,t(i-1)+h/2,y(i-1)+ (h/2)*s1);
s3 = feval(F,t(i-1)+h/2,y(i-1)+ (h/2)*s2);
s4 = feval(F,t(i-1)+h,y(i-1)+ h*s3);
y(i) = y(i-1) + ...
(h/6)*( s1 + 2*s2 + 2*s3 + s4 );
end
您将其转换为一阶系统,这意味着函数 F
变为矢量值并且您应该在 y
列表的构造中包括 y0
的形状.
y''=f(x,y,y')
转换为
y0'=y1
y1'=f(x,y0,y1)
这样(使用 matlab 索引)
F(x,y) = [ y(2), f(x,y(1),y(2)) ]
我有一个 Matlab 函数可以对一阶 ODE 进行 Runge-Kutta4k 逼近,我想调整它以适用于二阶 ODE。任何人都可以帮助我开始吗?这是我第一次订购 RK4K 时得到的:
function [y,t,h] = rungekutta4kh(F,y0,a,b,n)
% Euler ODE solver
t = linspace(a,b,n);
h = t(2)-t(1);
y = zeros(n,1);
y(1) = y0;
for i=2:n
s1 = feval(F,t(i-1),y(i-1));
s2 = feval(F,t(i-1)+h/2,y(i-1)+ (h/2)*s1);
s3 = feval(F,t(i-1)+h/2,y(i-1)+ (h/2)*s2);
s4 = feval(F,t(i-1)+h,y(i-1)+ h*s3);
y(i) = y(i-1) + ...
(h/6)*( s1 + 2*s2 + 2*s3 + s4 );
end
您将其转换为一阶系统,这意味着函数 F
变为矢量值并且您应该在 y
列表的构造中包括 y0
的形状.
y''=f(x,y,y')
转换为
y0'=y1
y1'=f(x,y0,y1)
这样(使用 matlab 索引)
F(x,y) = [ y(2), f(x,y(1),y(2)) ]