声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1287|回复: 7

[编程技巧] 求解微分方程组

[复制链接]
发表于 2007-3-21 22:45 | 显示全部楼层 |阅读模式

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

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

x
解 微分方程组
dy1/dx=M-(k2-(1-2*r)*x* Q/v)*y1+A1*y2
dy2/dx=B1*y1-B2*y2
请问:1,怎么用runge_kutta的方法求解出它在(0,1000)内的数值解。原程序怎么编?
2,请问步长能设为1吗?
3,如果不用runge_kutta的方法,用其他方法也可以。
谢谢 帮忙。

[ 本帖最后由 xinyuxf 于 2007-7-22 12:10 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-3-22 07:49 | 显示全部楼层

回复

请先给出参数值及初始条件,以方便他人调试.
另:建议自己先动手写一写.
 楼主| 发表于 2007-3-22 08:51 | 显示全部楼层
解 微分方程组
dy1/dx=M-(k2-(1-2*r)*x* Q/v)*y1+A1*y2
dy2/dx=A1*y1-B2*y2
其参数为:M=0.000002;A1=0.95;考=5.0;B2=1;Q=0.00005;V=0.0251;r=1;
初始条件:x=0;y1=20000;y2=300000;
请问:1,怎么用runge_kutta的方法求解出它在(0,1000)内的数值解。原程序怎么编?
2,请问步长能设为1吗?
3,如果不用runge_kutta的方法,用其他方法也可以。
谢谢 帮忙:lol


======================
用ode45可以轻易解决,自己动动手吧.
by xjzuo
======================

[ 本帖最后由 xjzuo 于 2007-3-23 08:51 编辑 ]
 楼主| 发表于 2007-3-26 12:09 | 显示全部楼层
实在不好意思,请问ode45是什么?
发表于 2007-3-26 13:17 | 显示全部楼层
help ode45
这是matlab最常用的命令,请紧记

[ 本帖最后由 ChaChing 于 2010-4-2 23:24 编辑 ]
 楼主| 发表于 2007-3-29 23:08 | 显示全部楼层

解微分方程组 谢谢 指点!急求!!

解 微分方程组
dy1/dx=M-(k2-(1-2*r)*x* Q/v)*y1+A1*y2
dy2/dx=B1*y1-B2*y2
请问:1,怎么用runge_kutta的方法求解出它在(0,1000)内的数值解。原程序怎么编?
2,请问步长能设为1吗?
3,如果不用runge_kutta的方法,用其他方法也可以。
这是我编的程序,但是画出的图很不合理,请指点一下?是不是解的思路不对,我就是用runge_kutta的方法解的。
下面是程序
k1=0.95;k2=5.0;k3=0.5
Q0=0.00005;v1=0.0251;c0=0.001;r=1;n=1
M=Q0*c0/v1;A1=k1;B2=k1+k3;c1=zeros(1,8001);c2=zeros(1,8001);c1(1,1)=20000;c2(1,1)=300000;
r1=zeros(4,201);r2=zeros(4,201);h=0.1;t=1:8001;
for i=1:h:800
    A2=(k2+(1-2*r)*(i+h/2)*Q0/v1)
    A22=(k2+(1-2*r)*(i+h)*Q0/v1)
    r1(1,n)=M-A2*c1(n)+A1*c2(n);
    r2(1,n)=A1*c1(n)-B2*c2(n);
    r1(2,n)=M-A2*(c1(n)+h/2*r1(1,n))+A1*(c2(n)+h/2*r2(1,n));
    r2(2,n)=A1*(c1(n)+h/2*r1(1,n))-B2*(c2(n)+h/2*r2(1,n));
    r1(3,n)=M-A2*(c1(n)+h/2*r1(2,n))+A1*(c2(n)+h/2*r2(2,n));
    r2(3,n)=A1*(c1(n)+h/2*r1(2,n))-B2*(c2(n)+h/2*r2(2,n));
    r1(4,n)=M-A22*(c1(n)+h*r1(3,n))+A1*(c2(n)+h*r2(3,n));
    r2(4,n)=A1*(c1(n)+h*r1(3,n))-B2*(c2(n)+h*r2(3,n));
    c1(n+1)=c1(1,n)+h/6*(r1(1,n)+2*r1(2,n)+2*r1(3,n)+r1(4,n));
    c2(n+1)=c2(1,n)+h/6*(r2(1,n)+2*r2(2,n)+2*r2(3,n)+r2(4,n));
    n=n+1
end
plot(t,c1,'r+');hold on;xlabel('时间/d'),ylabel('渗滤液BOD浓度/(mg/L)')
发表于 2007-3-30 08:53 | 显示全部楼层
这样检查比较累,建议直接用ode45求解.
随便取参数画了一下,不知是否是你要的效果.
z.jpg

评分

1

查看全部评分

 楼主| 发表于 2007-4-5 09:59 | 显示全部楼层
谢谢 楼上的答复,这个不是我要画的图,我感觉的我的计算有问题,咳!!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-1 13:23 , Processed in 0.060809 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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