annbota 发表于 2009-12-29 12:29

急!!!FORTRAN的四阶Runge-kutta方法求解微分方程

题目:用四阶Runge-kutta方法,求解阻尼振动方程md^2x/dt^2+cdx/dt+kx=0,已知质量m=100,劲度系数k=100,阻尼系数c=20,初速v=0,初始位置x=100,数值计算物体的位置和速度。(用fortran语言)
很急!!!
麻烦各位高手了,谢谢!!!

Seventy721 发表于 2011-4-8 22:35

      x0=0
      y0=1
      xf=1
      nn=100
      h=(xf-x0)/nn
      x=x0
      y=y0
c
100   continue
      call rk5(x,y,xx,yy)
c
      if(x.lt. xf)
       x=x+h
       go to 100
      end if
      stop
      end
c
c...This subroutine solves nonlienar ODE using the fifth order Rounge-Kutta Method
c   suggested bby Butcher - J. Australian Math. Soc., Vol. 4, 1964, o.179.
c
      subroutine rk5 (xi,yi,h,yy)
          ek1=h*feval(u,v,t);
          em1=h*geval(u,v,t);
          ek2=h*feval(u+k1/3.0,v+m1/3.0,t+h/3.0);
          em2=h*geval(u+k1/3.0,v+m1/3.0,t+h/3.0);
          ek3=h*feval(u+k1/6.0+k2/6.0,v+m1/6.0+m2/6.0,t+h/3.0);
          em3=h*geval(u+k1/6.0+k2/6.0,v+m1/6.0+m2/6.0,t+h/3.0);
          ek4=h*feval(u+k1/8.0+3.0*k3/8.0,v+m1/8.0+3.0*m3/8.0,t+h/2.0);
          em4=h*geval(u+k1/8.0+3.0*k3/8.0,v+m1/8.0+3.0*m3/8.0,t+h/2.0);
          ek5=h*feval(u+k1/2.0-3.0*k3/2.0+2.0*k4,v+m1/2.0-3.0*m3/2.0+2.0*m4,t+h);
          em5=h*geval(u+k1/2.0-3.0*k3/2.0+2.0*k4,v+m1/2.0-3.0*m3/2.0+2.0*m4,t+h);

          E1=(2.0*k1-9.0*k3+8.0*k4-k5)/30.0;
          E2=(2.0*m1-9.0*m3+8.0*m4-m5)/30.0;

          u=u+(k1+4.0*k4+k5)/6.0;
          v=v+(m1+4.0*m4+m5)/6.0;
          t=t+h;

c
      x1=xi
      y1=yi
      call func(x1,y1,f1)
      ek1=h*f1

      x2=xi+h/4
      y2=yi+ek1/4
      call func(x2,y2,f2)
      ek2=h*f2
c
      x3=xi+h/4
      y3=yi+ek1/8+ek2/8
      call func(x3,y3,f3)
      ek3=h*f2
c
      x4=xi+h/2
      y4=yi-ek2/2+ek3
      call func(x4,y4,f4)
      ek4=h*f4
c
      x5=xi+3.*h/4.
      y5=yi+3.*ek1/16.+9.*ek4/16.
      call func(x5,y5,f5)
      ek5=h*f5
c
      x6=xi+h
      y6=yi-3.*ek1/7.+2.*ek2/7.+12.*ek3/7.-12.*ek4/7.+8.*ek6/7.
      call func(x6,y6,f6)
      ek6=h*f6
c
      yy=yi+(7.*ek1+32.*ek3+12.*ek4+32.*ek5+7.*ek6)
      return
      end

      subroutine func(x,y,f,g)
c
c...This subroutine claculates the value of f(x,y)
c
      f=x
      return
      end

yangxiaokang 发表于 2010-3-8 21:17

回复 楼主 annbota 的帖子

用fortran语言不清楚,不过,用matlab求解很容易的

Seventy721 发表于 2010-4-2 13:41

给我你的邮箱我给你发代码。可以发私人消息给我。

lavi 发表于 2010-12-16 16:10

楼上是北师大二附中的么?

凌绝顶 发表于 2010-12-29 19:34

Seventy721 发表于 2010-4-2 13:41 static/image/common/back.gif
给我你的邮箱我给你发代码。可以发私人消息给我。

有好东西贡献出来嘛,还私聊什么啊

Rainyboy 发表于 2010-12-30 11:03

回复 5 # 凌绝顶 的帖子

我没有针对谁,只是想随便说说。
怎么说呢,自己的东西再不完善也是自己的东西,不大喜欢被别人随便用,也不喜欢分享;而别人的好东西呢,可以通过“求算法”,“求调试”等等来简单地得到,这都还是好的了,很多大公司的软件是“求”不到的,怎么办呢,用盗版呗,而且盗版得没有一点愧疚。
很多人,毫不隐晦的说,包括我在内,大概是这么一种心理吧。

赤血冰霜 发表于 2011-1-3 11:13

yangxiaokang 发表于 2010-3-8 21:17 static/image/common/back.gif
用fortran语言不清楚,不过,用matlab求解很容易的

那请问,知道一个含有未知数的行列式值为0,怎么用MATLAB求这个未知数啊?

Rainyboy 发表于 2011-1-3 13:35

回复 7 # 赤血冰霜 的帖子

实际上就是高次方程的求根,你遇到的是什么问题?求特征值么?

赤血冰霜 发表于 2011-1-3 14:47

回复 8 # Rainyboy 的帖子

对,就是求特征值的,

Rainyboy 发表于 2011-1-3 14:57

回复 9 # 赤血冰霜 的帖子

在MATLAB版搜一搜就能找到一大堆啊……用eig函数就行

赤血冰霜 发表于 2011-1-3 15:41

回复 10 # Rainyboy 的帖子

对MATLAB态不了解了,您能不能推荐本书啊,另外,如果知道一个行列式的值,且该行列式含有未知数,怎么求该未知数啊?谢谢了

Rainyboy 发表于 2011-1-3 22:33

回复 11 # 赤血冰霜 的帖子

我也不怎么用MATLAB,不敢乱推荐,呵呵。

含未知数的行列式,其实本身就是一个高次方程,所有可以用在高次方程求根的算法都可以用在这里,不明白你纠结在什么地方?把你的“含未知数的行列式”给出来看看?

赤血冰霜 发表于 2011-1-4 09:11

回复 12 # Rainyboy 的帖子

比如,DET(A)=0,A=[](5行5列),其中含一未知数,怎么在MATLAB中实现未知数的求解?

attempter 发表于 2011-4-8 21:51

回复 3 # Seventy721 的帖子

这个我也很需要 能发给我吗 876698559@qq.com
页: [1] 2
查看完整版本: 急!!!FORTRAN的四阶Runge-kutta方法求解微分方程