4 详解matlab实现龙格库塔算法求解复杂常微分方程组

该博客详细介绍了如何使用matlab实现四阶龙格库塔算法来求解复杂的常微分方程组。通过编程实现,展示了在不同点的解,并讨论了算法的精度和适用情况。
摘要由CSDN通过智能技术生成

目录

4.1 题目

4.2 问题背景

4.3 算法

4.4 matlab编程实现

4.5 结果展示

4.6 讨论


4.1 题目

4.2 问题背景

 

4.3 算法

 

4.4 matlab编程实现

主程序:

clear;

fun1=@(x,y1,y2,y3)-0.013*y1-1000*y1*y2;  % y1(x)的一阶导数d(y1(x))/dx

fun2=@(x,y1,y2,y3)-2500*y2*y3; 

fun3=@(x,y1,y2,y3)-0.013*y1-1000*y1*y2-2500*y2*y3;

x0=0;y0=[1;1;0];h=0.0001;       %赋初值

xn1=0.001;xn2=0.004;xn3=0.02;   %xn1处的待求函数值y(xn1)

yn1=RungeK4(x0,xn1,y0,h,fun1,fun2,fun3)

yn2=RungeK4(x0,xn2,y0,h,fun1,fun2,fun3)

yn3=RungeK4(x0,xn3,y0,h,fun1,fun2,fun3)

函数:

function [yn,Y]=RungeK(x0,xn,y0,h,fun1,fun2,fun3)

%四阶古典龙格库塔算法求解1-3元的微分方程通用解法

% x0为初始起点, x1为待求点自变量, h为步长, y为待求点函数值 , yn为所求点的三个函数值组成的向量,Y为中间值矩阵

format long

m=length(y0);  %m表示y向量包含的函数个数

n=(xn-x0)/h+1;

Y=zeros(3,n);   %创建二维数组以容纳n个列向量y(x,i)=[y1(x,i);y2(x,i);y3(x,i)]

yn=zeros(m,1);

Y(1:m,1)=y0;  %赋初值

K1=zeros(3,n);K2=zeros(3,n);K3=zeros(3,n);K4=zeros(3,n);   %创建二维数组以容纳n个列向量,K11i)对应y1k1(i)

for i=1:n

    x(i)=x0+(i-1)*h;

   

    %为向量K1,K2,K3,K4依次赋值

    K1(1,i)=fun1(x(i),Y(1,i),Y(2,i),Y(3,i));  %其对应y1k1i

    K1(2,i)=fun2(x(i),Y(1,i),Y(2,i),Y(3,i));  %其对应y2k1i

    K1(3,i)=fun3(x(i),Y(1,i),Y(2,i),Y(3,i));  %其对应y3k1i

   

    K2(1,i)=fun1(x(i)+1/2*h,Y(1,i)+1/2*K1(1,i)*h,Y(2,i)+1/2*K1(1,i)*h,Y(3,i)+1/2*K1(1,i)*h);  %为向量K2赋值,其对应y1k2i

K2(2,i)=fun2(x(i)+1/2*h,Y(1,i)+1/2*K1(2,i)*h,Y(2,i)+1/2*K1(2,i)*h,Y(3,i)+1/2*K1(2,i)*h);

    K2(3,i)=fun3(x(i)+1/2*h,Y(1,i)+1/2*K1(3,i)*h,Y(2,i)+1/2*K1(3,i)*h,Y(3,i)+1/2*K1(3,i)*h);

   

    K3(1,i)=fun1(x(i)+1/2*h,Y(1,i)+1/2*K2(1,i)*h,Y(2,i)+1/2*K2(1,i)*h,Y(3,i)+1/2*K2(1,i)*h);  %为向量K3赋值,其对应y1k3i

    K3(2,i)=fun2(x(i)+1/2*h,Y(1,i)+1/2*K2(2,i)*h,Y(2,i)+1/2*K2(2,i)*h,Y(3,i)+1/2*K2(2,i)*h);

    K3(3,i)=fun3(x(i)+1/2*h,Y(1,i)+1/2*K2(3,i)*h,Y(2,i)+1/2*K2(3,i)*h,Y(3,i)+1/2*K2(3,i)*h);

   

    K4(1,i)=fun1(x(i)+h,Y(1,i)+K3(1,i)*h,Y(2,i)+K3(1,i)*h,Y(3,i)+K3(1,i)*h);  %为向量K4赋值,其对应y1k4i

    K4(2,i)=fun2(x(i)+h,Y(1,i)+K3(2,i)*h,Y(2,i)+K3(2,i)*h,Y(3,i)+K3(2,i)*h);

    K4(3,i)=fun3(x(i)+h,Y(1,i)+K3(3,i)*h,Y(2,i)+K3(3,i)*h,Y(3,i)+K3(3,i)*h);

   

    for j=1:3

        %为向量y(x)依次赋值

        Y(j,i+1)=Y(j,i)+h/6*(K1(j,i)+2*K2(j,i)+2*K3(j,i)+K4(j,i));

    end

%     Y(1,i+1)=Y(1,i)+h/6*(K1(1,i)+2*K2(1,i)+2*K3(1,i)+K4(1,i));

%     Y(2,i+1)=Y(2,i)+h/6*(K1(2,i)+2*K2(2,i)+2*K3(2,i)+K4(2,i));

%     Y(3,i+1)=Y(3,i)+h/6*(K1(3,i)+2*K2(3,i)+2*K3(3,i)+K4(3,i));

end

for j=1:m

    %为所求函数值向量yn依次赋值

    yn(j)=Y(j,n);

end

   

   

4.5 结果展示

>> work4

yn1 =

   0.329092932578304

   1.442413401551611

  -0.189667611588121

yn2 =

   0.001386837752709

   1.943934950799432

  -0.001112694535328

yn3 =

   0.000000000000000

   1.946359874539511

  -0.000000000000000

4.6 讨论

(1)通过对y(x)、k1、k2、k3、k4向量化可以同时计算多元一阶微分方程,较为简便

(2)龙格库塔法比欧拉法精度较高,且收敛快,充分光滑时阶数越高精度越高。

(3)由于龙格库塔法基于Taylor公式,因此它对光滑性有一定要求,若光滑性差,则四阶龙格库塔法数值解精度可能不如二阶龙格库塔法。

(4)通过课本例题验证,本程序通用性较强且误差很小

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linhua090

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值