三个常微分方程的四阶Runge-Kutta解法MATLAB

3hvapo4f  于 2023-06-23  发布在  Matlab
关注(0)|答案(1)|浏览(121)

Lorenz方程如下:Lorenz Equations
参数值:σ = 10,B = 8/3,并且r = 28。采用x = y = z = 5的初始条件并从t = 0到20积分。对于这种情况,我们将使用四阶RK方法来获得具有恒定时间步长h = 0.03125的解。我们需要在绘制x,也就是y(1)与t的关系图如下:t vs x actual
然而,获得的数值收敛于零,使得yl(end,1)= -6.49e-48。我们得到的图形是:
t vs x obtained
代码如下所示。运行LorenzPlot.m以获得图形。您能提供代码的更正吗?谢谢
LorenzPlot.m

h = 0.03125;      % Stepsize
tspan = [0 20];   % Time interval
y0 = [5 5 5];     % Initial conditions
a = 10;           
b = 8/3;     
r = 28;
[tl, yl] = rk4sys(@lorenz,tspan,y0,h,a,b,r); % RK4 solution
% Time-series plot using RK4 method
figure(1)
plot(tl,yl(1:end,1))
legend('x = y = z = 5')
title('RK4 time plot')
xlabel("Time")
ylabel("Quantity")

rk4sys.m

function [tp,yp] = rk4sys(dydt,tspan,y0,h,varargin)
% Reference: Chapra, S. C. (2018). Applied Numerical Methods
% with MATLAB® for Engineers and Scientists Fourth Edition, pp.602-603
% rk4sys: fourth-order Runge-Kutta for a system of ODEs
% [t,y] = rk4sys(dydt,tspan,y0,h,p1,p2,...): integrates
% a system of ODEs with fourth-order RK method
% input:
% dydt = name of the M-file that evaluates the ODEs
% tspan = [ti, tf]; initial and final times with output
% generated at interval of h, or
% = [t0 t1 ... tf]; specific times where solution output
% y0 = initial values of dependent variables
% h = step size
% p1,p2,... = additional parameters used by dydt
% output:
% tp = vector of independent variable
% yp = vector of solution for dependent variables
if nargin < 4,error('at least 4 input arguments required'), end
if any(diff(tspan)<= 0),error('tspan not ascending order'), end
n = length(tspan);
ti = tspan(1);tf = tspan(n);
if n == 2
t = (ti:h:tf)'; n = length(t);
if t(n)<tf
t(n + 1) = tf;
n = n + 1;
end
else
t = tspan;
end
tt = ti; y(1,:) = y0;
np = 1; tp(np) = tt; yp(np,:) = y(1,:);
i = 1;
while(1)
tend = t(np + 1);
hh = t(np + 1) - t(np);
if hh > h,hh = h;end
while(1)
if tt+hh > tend,hh = tend-tt;end
k1 = dydt(tt,y(i,:),varargin{:})';
ymid = y(i,:) + k1*hh/2;
k2 = dydt(tt + hh/2,ymid,varargin{:})';
ymid = y(i,:) + k2*hh/2;
k3 = dydt(tt + hh/2,ymid,varargin{:})';
yend = y(i,:) + k3*hh;
k4 = dydt(tt + hh,yend,varargin{:})';
phi = (k1 + 2*(k2 + k3) + k4)/6;
y(i + 1,:) = y(i,:) + phi*hh;
tt = tt + hh;
i = i + 1;
if tt >= tend,break,end
end
np = np + 1; tp(np) = tt; yp(np,:) = y(i,:);
if tt >= tf,break,end
end

洛伦茨m

function yl = lorenz(t,y,a,b,r)
yl = [-a*y(1)-a*y(2);
    r*y(1)-y(2)-y(1)*y(3);
    -b*y(3)+y(1)*y(2)];
end
soat7uwm

soat7uwm1#

你的第一个洛伦兹方程似乎是错误的:应改为:

更改lorezn函数上的符号似乎可以纠正错误:

function yl = lorenz(t,y,a,b,r)
yl = [-a*y(1)+a*y(2);
    r*y(1)-y(2)-y(1)*y(3);
    -b*y(3)+y(1)*y(2)];
end

相关问题