matlab:使用四阶龙格库塔方法求解微分方程组

%书籍:常用数值算法及其matlab实现
%第10章 常微分方程初值问题的数值解法,例10.14使用
%四阶龙格库塔方法
function [t,z] = rk4symeq(fun, t0, tf, Za, h)
%fun:微分方程的右表达式
%t0, tn为区间
%Za为初值,是列向量
M = floor(tf-t0)/h ;      %离散点的个数M+1
if t0 >= tf
    printf('左端点必须小于右端点');
    return;
end
N = length(Za);           %获得变量个数,N
z = zeros(M+1, N);
t = zeros(M +1, 1);
t =[t0 : h :tf]';
z(1,:) = Za';            %假设Za为列向量,与微分方程中的变量方向统一,变成行向量

for i = 1:M
    K1 =  feval(fun, t(i) , z(i,:));                    %K是行向量
    K2 =  feval(fun, t(i)+1/2*h ,z(i,:)+1/2* h*K1);
    K3 =  feval(fun, t(i)+1/2*h ,z(i,:)+1/2* h*K2);
    K4 =  feval(fun, t(i)+ h ,z(i,:)+ h*K3);   
    z(i+1,:) = z(i,:) +h/6 *(K1 + 2*K2 + 2*K3 + K4);
end
方程组1-输出为行向量
%书籍:常用数值算法及其matlab实现
%第10章 常微分方程初值问题的数值解法
%四阶龙格库塔,例10.15
function s = exa10_15(t,z)
%z是个向量,1*3
%输出s也是向量,1*3
s = zeros(1,3);
dy1 = -10*z(1) +10*z(2);
dy2 = 28*z(1) - z(2) - z(1)*z(3);
dy3 = -8/3*z(3) + z(1)*z(2);
s = [dy1 dy2 dy3];          %输出s为行向量

微分方程组——输出为列向量
%书籍:常用数值算法及其matlab实现
%第10章 常微分方程初值问题的数值解法
%四阶龙格库塔,例10.15
function s = exa10_15b(t,z)
%z是个向量,1*3
%输出s也是向量,1*3
s = zeros(1,3);
dy1 = -10*z(1) +10*z(2);
dy2 = 28*z(1) - z(2) - z(1)*z(3);
dy3 = -8/3*z(3) + z(1)*z(2);
s = [dy1; dy2; dy3];          %输出s为列向量,用于ode45调用
主函数
clear all;clc;close all;
%书籍:常用数值算法及其matlab实现
%第10章 常微分方程组初值问题的数值解法
%四阶龙格库塔,例10.15
%函数原型 function [t,z] = rk4symeq(fun, t0, tn, Za, h)
format long
t0 = 0; tf = 5;
Za = [-8 ; 8; 27];     %x初值
h1 = 0.01; 

[t1,z1] = rk4symeq(@exa10_15, t0, tf , Za, h1);
figure(1)
plot(t1,z1(:,1),'b',t1,z1(:,2), 'r',t1,z1(:,3), 'g--')
legend('y1','y2','y3')
figure(2)
plot3(z1(:,1),z1(:,2),z1(:,3));
xlabel('x');ylabel('y');zlabel('z');

[t2,z2] = ode45(@exa10_15b, [0,5] ,[-8 , 8 ,27]);        %用系统函数
figure(3)
plot(t2,z2(:,1),'b',t2,z2(:,2), 'r',t2,z2(:,3), 'g--')
legend('y1','y2','y3')

运行结果:

 

 

 

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用 MATLAB 实现四阶龙格库塔方法求解微分方程的代码,并附上详细注释: ```matlab % 定义常微分方程 dy/dx = f(x,y) function dydx = myODE(x,y) dydx = zeros(2,1); % 初始化输出 dydx(1) = y(2); % 第一个方程 dydx(2) = -y(1); % 第二个方程 end % 定义龙格库塔方法 function [x,y] = rk4(ode, xspan, y0, h) x = xspan(1):h:xspan(2); % 初始化 x 的值 y = zeros(length(y0), length(x)); % 初始化 y 的值 y(:,1) = y0; % 设置初始条件 for i = 1:length(x)-1 k1 = ode(x(i), y(:,i)); k2 = ode(x(i)+h/2, y(:,i)+h/2*k1); k3 = ode(x(i)+h/2, y(:,i)+h/2*k2); k4 = ode(x(i)+h, y(:,i)+h*k3); y(:,i+1) = y(:,i) + h/6*(k1+2*k2+2*k3+k4); % 计算下一个时间步的 y 值 end end % 运行代码 xspan = [0 10]; % x 的范围 y0 = [1 0]; % 初始条件 h = 0.1; % 步长 [x,y] = rk4(@myODE, xspan, y0, h); % 调用 rk4 函数 plot(x,y(1,:)) % 画图 xlabel('x') ylabel('y') title('y vs. x') ``` 注释解释如下: - 第 1 行:定义了一个函数 `myODE`,其中 `x` 和 `y` 分别是自变量和因变量,`dydx` 是输出的导数值。 - 第 7 行:定义了一个函数 `rk4`,其中 `ode` 是常微分方程,`xspan` 是自变量范围,`y0` 是初始条件,`h` 是步长。 - 第 8 行:初始化 `x` 的值。 - 第 9 行:初始化 `y` 的值,其中 `length(y0)` 是方程的数量,`length(x)` 是时间步数。 - 第 10 行:设置初始条件。 - 第 11 行:循环时间步,并依次计算 `k1`、`k2`、`k3`、`k4`,最后计算下一个时间步的 `y` 值。 - 第 18 行:运行代码,得到 `x` 和 `y` 的值。 - 第 19 行:画出 `y` vs. `x` 的图像。 - 第 20 行和第 21 行:添加图像的标签和标题。 需要注意的是,以上代码仅仅是一个示例,你需要根据具体的常微分方程进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值