声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6205|回复: 15

[计算数学] 求助四阶Runge-Kutta法 解微分方程组程序

[复制链接]
发表于 2008-5-24 10:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
帮忙 给出四阶Runge-kutta法 解微分方程组程序  不能用Matlab库函数程序
谢谢
回复
分享到:

使用道具 举报

 楼主| 发表于 2008-5-24 10:43 | 显示全部楼层

附加

最好是Burgers方程的:victory:
发表于 2008-5-24 17:22 | 显示全部楼层

回复 楼主 的帖子

直接根据Runge-kutta写一个应该就可以了吧

论坛内有各种解法的原代码,你找一下
发表于 2008-5-24 17:44 | 显示全部楼层

回复 楼主 的帖子

发表于 2008-5-24 21:26 | 显示全部楼层
这个是小事情...不过最好是自己写一个
发表于 2008-5-26 10:03 | 显示全部楼层
% 4阶龙格库塔法求chen's吸引子
% 方程表达式
% dx/dt = a*(y-x)
% dy/dt = (c-a)*x - x*z + c*y
% dz/dt = x*y - b*z
clc;
close all;
clear all;
%参数值
a = 35;
b = 3;
c = 28;
%初始值
x_0 = -1;
y_0 = 0;
z_0 = 1;
h = 0.01;             % 积分时间步长
step1 = 10000;        % 前面的迭代点数
step2 = 5000;         % 后面的迭代点数
X = [];
Y = [];
Z = [];
for(i = 1:1:(step1 + step2))
    %e1
    x_e1 = -a*x_0 + a*y_0;
    y_e1 = c*y_0 + (c - a)*x_0 - x_0*z_0;
    z_e1 = -b*z_0 + x_0*y_0;
    %e2
    y_h = y_0 + 0.5*h*y_e1;
    x_e2 = -a*(x_0 + 0.5*h*x_e1) + a*y_h;
   
    x_h = x_0 + 0.5*h*x_e1;
    z_h = z_0 + 0.5*h*z_e1;
    y_e2 = c*(y_0 + 0.5*h*y_e1) + (c - a)*x_h - x_h*z_h;
   
    z_e2 = -b*(z_0 + 0.5*h*z_e1) + x_h*y_h;
    %e3
    y_h = y_0 + 0.5*h*y_e2;
    x_e3 = -a*(x_0 + 0.5*h*x_e2) + a*y_h;
   
    x_h = x_0 + 0.5*h*x_e2;
    z_h = z_0 + 0.5*h*z_e2;
    y_e3 = c*(y_0 + 0.5*h*y_e2) + (c - a)*x_h - x_h*z_h;
   
    z_e3 = -b*(z_0 + 0.5*h*z_e2) + x_h*y_h;
    %e4
    y_h = y_0 + h*y_e3;
    x_e4 = -a*(x_0 + h*x_e3) + a*y_h;
   
    x_h = x_0 + h*x_e3;
    z_h = z_0 + h*z_e3;
    y_e4 = c*(y_0 + h*y_e2) + (c - a)*x_h - x_h*z_h;
   
    z_e4 = -b*(z_0 + h*z_e2) + x_h*y_h;
    %叠代
    x_1 = x_0 + 1/6*h*(x_e1 + 2*x_e2 +2*x_e3 + x_e4);
    y_1 = y_0 + 1/6*h*(y_e1 + 2*y_e2 +2*y_e3 + y_e4);
    z_1 = z_0 + 1/6*h*(z_e1 + 2*z_e2 +2*z_e3 + z_e4);
   
    X = [X,x_1];
    Y = [Y,y_1];
    Z = [Z,z_1];
   
    x_0 = x_1;
    y_0 = y_1;
    z_0 = z_1;
end
X = X(step2+1:end);
Y = Y(step2+1:end);
Z = Z(step2+1:end);
figure(1);
plot3(Z(1000:end),Y(1000:end),X(1000:end));
grid on
xlabel('x');
ylabel('y');
zlabel('z');

这个应该是可以借鉴的。

评分

1

查看全部评分

发表于 2008-5-27 07:52 | 显示全部楼层

回复 6楼 的帖子

麻烦了点,但是程序还是比较好的
 楼主| 发表于 2008-5-27 11:21 | 显示全部楼层

求助

有没有求解微分方程组的Matlab程序 比如Du/Dt=Mu,其中u为69*1阶向量,M为69*69阶矩阵
 楼主| 发表于 2008-5-27 14:43 | 显示全部楼层
怎么没人理呀,恳请各位高手帮忙,我很着急!
 楼主| 发表于 2008-5-27 14:49 | 显示全部楼层
可以调用库函数ode45('odefun',[0,2],u0),可是我不会编odefun这个函数,请各位高手帮忙!
发表于 2008-5-27 14:50 | 显示全部楼层

回复 10楼 的帖子

还是一样的,只是fun书写比较麻烦而以
 楼主| 发表于 2008-5-27 15:07 | 显示全部楼层
可是没有现成的例子我感觉有点无从下手,请问论坛里有没有这方面的例子呢?不好意思,我是初学者。
发表于 2008-5-27 21:59 | 显示全部楼层
上面的精华贴可以参考!
发表于 2008-5-27 22:12 | 显示全部楼层
10楼说的对,ode45就是lz要的库函数
 楼主| 发表于 2008-5-28 11:07 | 显示全部楼层
我调用库函数 [T,V]=ODE45(@fun,[0,0.2],V0,[ ],M0,M1);
其中  function f=fun(t,V,M0,M1)
          %其中V为列向量M0,M1为矩阵
      f=(M0+M1)*V;
运行结果显示
??? Attempt to execute SCRIPT ode45 as a function.

Error in ==> C:\Documents and Settings\hp\桌面\ode45.m
On line 47  ==> [T,V]=ODE45(@fun,[0,0.2],V0,[],M0,M1);
请问这是怎么回事呢?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-19 11:27 , Processed in 0.063131 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表