Fortran Coder

查看: 6747|回复: 4
打印 上一主题 下一主题

[微分方程] 四阶龙格库塔方程组代码,为什么不出结果?

[复制链接]

5

帖子

1

主题

0

精华

入门

F 币
29 元
贡献
19 点
跳转到指定楼层
楼主
发表于 2015-3-27 10:42:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如下所示,运算结果不对,请问哪里有问题?
[Fortran] 纯文本查看 复制代码
module counts
 integer,parameter::nstep=100
 integer,parameter::nvar=3 !Funcion dimentions
 end module counts

 module d1
 use counts
 real::xx(nstep),y(nvar,nstep)
 end module d1


 subroutine derivs(x,y,dydx)
 implicit none
 integer::n !方程维数
real::dydx(*),x,y(*)
 dydx(1)=y(2)*y(3)
 dydx(2)=-y(1)*y(3)
 dydx(3)=-0.51*y(1)*y(2)
 end subroutine derivs


 subroutine rk4(y,dydx,n,x,h,yout,derivs)
 integer,parameter::nmax=3
 real::h,x,dydx(n),y(n),yout(n)
 external::derivs
 integer::i
 real::h6,hh,xh,dym(nmax),dyt(nmax),yt(nmax)
 hh=h*0.5
 h6=h/6.
 xh=x+hh

 do i=1,n !First step,k1=dydx(i)
 yt(i)=y(i)+hh*dyt(i)
 enddo

 call derivs(xh,yt,dyt) !Second step,k2=dyt
 do i=1,n
 yt(i)=y(i)+hh*dyt(i)
 enddo

 call derivs(xh,yt,dym) !Third step,k3=dym
 do i=1,n
 yt(i)=y(i)+h*dym(i)
 dym(i)=dyt(i)+dym(i) !k3=k3+k2
 enddo

 call derivs(x+h,yt,dyt)!Fourth step,k4=dyt
 do i=1,n
 yout(i)=y(i)+h6*(dydx(i)+dyt(i)+2.*dym(i))
 end do !Every step calculate dydx from x and above y(i)

 return
 end subroutine rk4



 subroutine rkdumb(vstart,nvar,x1,x2,nstep,derivs)
 integer::nstep,nvar
 integer,parameter::nmax=10,nstpmx=100
 real::x2,x1,vstart(nvar),xx(nstpmx),y(nmax,nstpmx)
 external derivs
 integer::i,k
 real::h,x,dv(nmax),v(nmax)
 do i=1,nvar !方程维数
v(i)=vstart(i)
 y(i,1)=v(i)
 enddo
 xx(1)=x1
 x=x1
 h=(x2-x1)/nstep !步长
do k=1,nstep
 call derivs(x,v,dv)
 call rk4(v,dv,nvar,x,h,v,derivs)
 if(x+h.eq.x) pause'stepsize not significant in rkdumb.'
 x=x+h
 xx(k+1)=x
 do i=1,nvar
 y(i,k+1)=v(i)
 enddo
 enddo
 return
 end subroutine rkdumb



 program solve319
 use counts
 use d1
 implicit none
 integer::i
 real::x2,x1,vstart(nvar)
 external::derivs,rk4,rkdumb
 vstart(1)=0
 vstart(2)=1
 vstart(3)=1
 x1=0
 x2=12
 print*,vstart(1)
 open(unit=11,file='20150327out.dat')
 do i=1,nstep
 write(unit=11,fmt='(3f12.6)')y(1,i),y(2,i),y(3,i)

 call rkdumb(vstart,nvar,x1,x2,nstep,derivs)
 enddo
 end 
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

沙发
发表于 2015-11-26 23:01:14 | 只看该作者
这种应该有比较通用的算法程序吧,直接找个现成的比较看看。

15

帖子

2

主题

0

精华

新人

F 币
142 元
贡献
84 点
板凳
发表于 2015-12-28 18:55:03 | 只看该作者
我刚好最近写了一个RK4变步长的Fortran程序, 不知道你有兴趣要没?

8

帖子

5

主题

0

精华

入门

F 币
76 元
贡献
42 点
地板
发表于 2016-1-30 10:53:16 来自移动端 | 只看该作者
我有有兴趣要

4

帖子

1

主题

0

精华

入门

F 币
40 元
贡献
23 点
5#
发表于 2016-2-6 19:31:59 | 只看该作者
本帖最后由 chenk 于 2016-2-6 19:34 编辑
糖盒love玲珑 发表于 2015-12-28 18:55
我刚好最近写了一个RK4变步长的Fortran程序, 不知道你有兴趣要没?

请问可求解2阶微分方程组吗?我现在需要用RK4解2阶微分方程组。。需要解决算法。。。求助
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-26 05:26

Powered by Tencent X3.4

© 2013-2024 Tencent

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