一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

非刚性常微分方程的数值解法通常会用四阶龙格库塔算法,其matlab函数对应ode45。

对于dy/dx = f(x,y),y(0)=y0。

其四阶龙格库塔公式如下:

对于通常计算,四阶已经够用,四阶以上函数f(x,y)计算工作量大大增加而精度提高较慢。

下面以龙格库塔法解洛伦兹方程为例:

matlab代码如下:

main.m:

复制代码
 1 clear all;
 2 close all;
 3 clc;
 4 
 5 %系统龙格库塔法
 6 [t,h] = ode45(@test_fun,[0 40],[12 4 0]);
 7 plot3(h(:,1),h(:,2),h(:,3));
 8 grid on;
 9 
10 %自定义龙格库塔法
11 [t1,h1]=runge_kutta(@test_fun,[12 4 0],0.01,0,40);
12 figure;
13 plot3(h1(1,:),h1(2,:),h1(3,:),'r')
14 grid on;
复制代码

runge_kutta.m(函数参考网络):

复制代码
 1 %参数表顺序依次是微分方程组的函数名称,初始值向量,步长,时间起点,时间终点(参数形式参考了ode45函数)
 2 function [x,y]=runge_kutta(ufunc,y0,h,a,b)
 3 n=floor((b-a)/h);       %步数
 4 x(1)=a;                 %时间起点
 5 y(:,1)=y0;              %赋初值,可以是向量,但是要注意维数
 6 for i=1:n               %龙格库塔方法进行数值求解    
 7     x(i+1)=x(i)+h;    
 8     k1=ufunc(x(i),y(:,i));  
 9     k2=ufunc(x(i)+h/2,y(:,i)+h*k1/2);    
10     k3=ufunc(x(i)+h/2,y(:,i)+h*k2/2);   
11     k4=ufunc(x(i)+h,y(:,i)+h*k3);   
12     y(:,i+1)=y(:,i)+h*(k1+2*k2+2*k3+k4)/6;
13 end
复制代码

test_fun(洛伦兹方程):

复制代码
1 %构造微分方程
2 function dy=test_fun(t,y)
3 a = 16;
4 b = 4;
5 c = 45;
6 
7 dy=[a*(y(2)-y(1));
8     c*y(1)-y(1)*y(3)-y(2);
9     y(1)*y(2)-b*y(3)];
复制代码

得到很经典的洛伦兹吸引子,结果如下:

posted on   一杯清酒邀明月  阅读(4100)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示