找回密码
 注册
Simdroid-非首页
查看: 133|回复: 10

[3. Fortran] 求高手看一下fortran程序???谢谢

[复制链接]
发表于 2011-6-7 19:08:13 | 显示全部楼层 |阅读模式 来自 陕西西安
小弟编写了一个PR状态方程的程序,用牛顿迭代法算v,运行没有问题,就是算的结果不如人意,求高手帮忙看一下,程序如下:

program PREOS
implicit none
  integer i,n
  real,parameter::R=83.14
  real,parameter::Tc=187.564
  real,parameter:c=45.592
  real,parameter::error=0.0000001
  real::p=319.144
  real::T=187.564
  real::w=0.01142
  real::m,b,a,Tr,f,f1,Pr,Pa
  real::v,v0
  real::z1,z2
  read(*,*)v0,n
  
  m=0.37464+1.54226*w-0.06992*w**2
  Tr=T/Tc
  a=0.45724*(R**2)*(Tc**2)*(1.0+m*(1.0-Tr**0.5))**2/Pc
  b=0.07780*R*Tc/Pc
  i=1
  do while(.true.)
   
     f=v0**3-(R*T/P-b)*v0**2+(a/P-2*b*R*T/P-3*b**2)*v0-b*(a/P-b*R*T/P-b**2)
     f1=3*v0**2-2*v0*(R*T/P-b)+(a/P-2*b*R*T/P-3*b**2)
     v=v0-f/f1
  if(abs(v-v0)<error)exit
  v0=v
  i=i+1
  if(i>=n)exit

   end do
   
   Pr=R*T/(V-b)
   Pa=-a/(v*(v+b)+b*(v-b))
   z1=Pr/Pc
   z2=Pa/Pc
   
   write(*,"('i=',i4)")i
   write(*,"('v=',f12.8)")v
   write(*,"('Pr=',f20.8)")Pr
   write(*,"('Pa=',f20.8)")Pa
   write(*,"('z1=',f20.8)")z1
   write(*,"('z2=',f20.8)")z2

   stop
end




其中PR状态方程如下所示:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2011-6-7 19:10:16 | 显示全部楼层 来自 陕西西安
Simdroid开发平台
1# xiaomaoxiaomao



第六行为
real,parameter::pc=45.592
回复 不支持

使用道具 举报

发表于 2011-6-7 22:51:50 | 显示全部楼层 来自 日本
你这代码属于不能拷贝的那一种,想帮你也用不上力啊
回复 不支持

使用道具 举报

发表于 2011-6-8 01:59:08 | 显示全部楼层 来自 浙江杭州
m=0.37464+1.54226*w-0.26992*w**2
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-8 13:49:42 | 显示全部楼层 来自 陕西西安
4# gdyu_yu


那牛顿迭代应该没有问题吧?
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-8 13:51:10 | 显示全部楼层 来自 陕西西安
3# guojunhang


可以拷贝吧,恩,我上边就是复制粘贴上去的,可以复制粘贴上来的呀?
回复 不支持

使用道具 举报

发表于 2011-6-8 15:06:26 | 显示全部楼层 来自 江苏南京
本帖最后由 铁道科学 于 2011-6-8 15:20 编辑

看了一下,因为不大明白你的算法,暂时只能帮你把代码整理下,方便后面帮你的人看。
  1. program PREOS
  2. implicit none
  3.   integer i,n
  4.   real,parameter :: R=83.14
  5.   real,parameter :: Tc=187.564
  6.   real,parameter :: Pc=45.592
  7.   real,parameter :: error=0.0000001
  8.   real :: p=319.144
  9.   real :: T=187.564
  10.   real :: w=0.01142
  11.   real :: m,b,a,Tr,f,f1,Pr,Pa
  12.   real :: v,v0
  13.   real :: z1,z2

  14.   read(*,*) v0,n
  15.   
  16.   m  = 0.37464+1.54226*w-0.06992*w**2
  17.   Tr = T/Tc
  18.   a  = 0.45724*(R**2)*(Tc**2)*(1.0+m*(1.0-Tr**0.5))**2/Pc
  19.   b  = 0.07780*R*Tc/Pc

  20.   do i = 1,n
  21.     f  = v0**3-(R*T/P-b)*v0**2+(a/P-2*b*R*T/P-3*b**2)*v0-b*(a/P-b*R*T/P-b**2)
  22.     f1 = 3*v0**2-2*v0*(R*T/P-b)+(a/P-2*b*R*T/P-3*b**2)
  23.     v  = v0-f/f1
  24.     if(abs(v-v0)<error) exit
  25.     v0 = v
  26.   end do
  27.    
  28.   Pr = R*T/(V-b)
  29.   Pa = -a/(v*(v+b)+b*(v-b))
  30.   z1 = Pr/Pc
  31.   z2 = Pa/Pc
  32.    
  33.   write(*,"('i=',i4)")i
  34.   write(*,"('v=',f12.8)")v
  35.   write(*,"('Pr=',f20.8)")Pr
  36.   write(*,"('Pa=',f20.8)")Pa
  37.   write(*,"('z1=',f20.8)")z1
  38.   write(*,"('z2=',f20.8)")z2

  39. end
复制代码
回复 不支持

使用道具 举报

发表于 2011-6-8 15:39:15 | 显示全部楼层 来自 江苏南京
不知道下面的架构能不能满足你的要求,仅仅是一个大概的框架,未验证,请大家指教。
  1. function Fx(x)
  2.     函数体
  3. end function
复制代码

主程序:
  1. Program main
  2.   implicit none
  3.   real x,y,dx,yf,yt,nd

  4.   nd = 1.0
  5.   x  = 3.0
  6.   yt = 9.0
  7.   dx = 1.0
  8.   yf = Fx(x)
  9.   do while(dx>1e-6)
  10.       x  = x+nd*dx
  11.       y  = Fx(x)
  12.       dx = nd*dx / (y-fy) * (yt-y)
  13.   end do

  14. end
复制代码
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-8 20:21:06 | 显示全部楼层 来自 陕西西安
7# 铁道科学


谢谢。。。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-8 20:22:34 | 显示全部楼层 来自 陕西西安
8# 铁道科学

谢谢了。。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-6-8 22:27:38 | 显示全部楼层 来自 陕西西安
4# gdyu_yu

谢谢斑竹!!!!
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-1 11:37 , Processed in 0.039789 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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