24小时热门版块排行榜    

查看: 1791  |  回复: 18

snoopyzhao

至尊木虫 (职业作家)


余泽成(金币+1):谢谢参与应助! 2010-07-11 18:03:54
下面这个是可以编译通过的,但不保证准确性。建议你以后写程序时更认真一些,不要把 K(4) 写成 K4,把 ma(2) 写成 m(2) 等……
CODE:
C     此程序是运用peng-robinson方程计算气体的逸度系数faita(1),faita(2),是利用牛顿迭代法求解
C     然后通过origin拟合得到这些数据N1,N2,m1,m2,K1,K2
C     求解得到f1,f2,x1的过程,首先利用牛顿迭代法求解IAST理论得到x1, 然后利用表达式求解f1,f2
      PROGRAM MAIN
      LOGICAL converged
      integer S N SQ
      parameter(EPS=1.0E-06,R=83.14,epsilon=1-2**(0.5),sigma=1+2**(0.5)
     *)
      dimension faita(7),ns(4),ma(4),K(4),M(7),omiga(7),
     *Tc(7),Pc(7),b(7),beta(7),alpha(7),q(7),as(7),Z1(7)
      real alpha,beta,Tr,omiga,M,rho(7),q,a,b,SV,I(7),ZM,SSA,SSB,SSC,
     *SSD
      DATA  M/16.043,30.070,44.097, 58.123,72.150, 44.01, 28.01/
      DATA omiga/0.012,0.100,0.152,0.2,0.252,0.224,0.048/
      DATA Tc/190.6,305.3,369.8,425.1,469.7,304.2,132.9/
      DATA Pc/45.99,48.72,42.48,37.96,33.70,73.83,34.99/
      READ(*,*)P1
C     计算peng-robinson方程中需要的一些参量
      DO 3 N=1,7
      P=P1/100
      SV=(1-(T/Tc(N))**(0.5))**2
      alpha(N)=(1+(0.37464+1.54226*omiga(N)-0.26992*omiga(N)**2)*SV)
      as(N)=((0.45724*R**2*Tc(N)**2)/Pc(N))*alpha(N)
      b(N)=0.07779*R*Tc(N)/Pc(N)
      beta(N)=b(N)*P/(R*T)
      q(N)=as(N)*alpha(N)*P/(R**2*T**2)
3     CONTINUE
C     运用牛顿迭代法开始求解压缩因子的方程

      IF(N.LT.7.AND.N.GT.1)THEN
        ZM=1
        DO WHILE(.not.converged.and.ABS(MSD(ZM)).GT.0)
        SSA=MS(ZM,beta(N),q(N))
        SSB=MSD(ZM,beta(N),q(N))
        ZM=ZM-SSA/SSB
        converged=(abs(SSA)/(SSB)).LT.EPS
        END DO
      ELSE
      END IF
      do 4 N=1,7
      Z1(N)=ZM
4     CONTINUE
C     求解密度和逸度
      DO 5 N=1,7
      I(N)=(1/(sigma-epsilon))*log((Z1(N)+sigma*beta(N))/
     *(Z1(N)+epsilon*beta(N)))
      rho(N)=(P/(Z1(N)*R*T))*M(N)*EPS
      faita(N)=SVF(Z1(N),beta,q(N),I(N))
5     CONTINUE

C     运用IAST理论以及上面得到的逸度系数,开始求解IAST的方程
      S=0
      X=1
      SSC=iast(X,P,y1,faita(1),faita(2))
      SSD=diast(X,P,y1,faita(1),faita(2))
      DO WHILE(.not.converged.and.ABS(SSD).GT.0)
      X=X-SSC/SSD
      S=S+1
      converged=(abs(SSC/SSD).LT.EPS)
      END DO
      x1=X
20    format(1x,3F9.4)
      write(*,20)f1,f2,x1
      end



      function MS(SA,SB,SC)
      MS=SA**3-(1-SB)*SA**2+(SC-2*SB-3*SB
     ***2)*SA-(SC*SB-SB**2-SB**3)
      end


      function MSD(SD,SE,SF)
      MSD=3*SD**2-2*(1-SE)*SD+(SF-2*SE-
     *3*SE**2)
      end


      function         iast(MADD,P,YY,SG1,SG2)
      dimension  ns(4),ma(4),K(4)
      DATA  ns/2.0,3.0,4.0,5.0/
      DATA ma/1.0,2.0,3.0,4.0/
      DATA K/5.0,6.0,7.0,8.0/
      f1=P*YY*SG1/MADD
      f2=P*(1-YY)*SG2/(1-MADD)
      iast=ns(1)*LOG(1+K(1)*f1**ma(1))+ns(2)*LOG
     *(1+K(2)*f1**ma(2))-ns(3)*LOG(1+K(3)*f2**ma(3))+ns(4)*LOG(1+
     *K(4)*f2**ma(4))
      end


      function  diast(MAD,S,Y,SG3,SG4)
      dimension  ns(4),ma(4),K(4)
      DATA  ns/2.0,3.0,4.0,5.0/
      data ma/1.0,2.0,3.0,4.0/
      data K/5.0,6.0,7.0,8.0/
      f1=S*Y*SG3/MAD
      f2=S*(1-Y)*SG4/(1-MAD)
      diast=(ma(1)*ns(1)*K(1)*f1*(ma(1)-1))/(1+
     *K(1)*f1**ma(1))+(ma(2)*ns(2)*K2*f1*(ma(2)-1))/(1+K(2)*f1**ma(2))-
     *(ma(3)*ns(3)*K(3)*f2*(ma(3)-1))/(1+K(3)*f2**ma(3))+
     *(ma(4)*ns(4)*K(4)*f2*(ma(4)-1))/(1+K(4)*f2**ma(4))
      END

      FUNCTION SVF(SG5,SG6,SG7,SG8)
      SVF=exp(SG5-1-log(SG5-SG6)-SG7*SG8)
      END

11楼2010-07-11 17:53:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


余泽成(金币+1):谢谢参与应助! 2010-07-11 18:04:09
引用回帖:
Originally posted by zyj8119 at 2010-07-11 17:40:51:
beta(N)和q(N)本来就是计算得到的数组数值啊,怎么给初值呢,前面已经算了啊。

但你那个 MS(ZM) 函数中的 beta(N) 已不在循环中了啊,这个时候 N 就不知道该取什么值了……
12楼2010-07-11 17:56:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zyj8119

木虫 (著名写手)

引用回帖:
Originally posted by snoopyzhao at 2010-07-11 17:56:37:


但你那个 MS(ZM) 函数中的 beta(N) 已不在循环中了啊,这个时候 N 就不知道该取什么值了……

谢谢!!!!!!跪谢!!!!
好好学习,天天向上。
13楼2010-07-11 20:12:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zyj8119

木虫 (著名写手)

C     此程序是运用peng-robinson方程计算气体的逸度系数faita(1),faita(2),是利用牛顿迭代法求解
C     然后通过origin拟合得到这些数据N1,N2,m1,m2,K1,K2
C     求解得到f1,f2,x1的过程,首先利用牛顿迭代法求解IAST理论得到x1, 然后利用表达式求解f1,f2
      PROGRAM MAIN
      LOGICAL converged
      integer S N SQ
      parameter(EPS=1.0E-06,R=83.14,epsilon=1-2**(0.5),sigma=1+2**(0.5)
     *)
      dimension faita(7),ns(4),ma(4),K(4),M(7),omiga(7),
     *Tc(7),Pc(7),b(7),beta(7),alpha(7),q(7),as(7),Z1(7)
      real alpha,beta,Tr,omiga,M,rho(7),q,a,b,SV,I(7),ZM,SSA,SSB,SSC,
     *SSD,T,f1,f2
      DATA M/16.043,30.070,44.097, 58.123,72.150, 44.01, 28.01/
      DATA omiga/0.012,0.100,0.152,0.2,0.252,0.224,0.048/
      DATA Tc/190.6,305.3,369.8,425.1,469.7,304.2,132.9/
      DATA Pc/45.99,48.72,42.48,37.96,33.70,73.83,34.99/
      READ(*,*)P1
C     计算peng-robinson方程中需要的一些参量
      DO 3 N=1,7
      P=P1/100
      SV=(1-(T/Tc(N))**(0.5))**2
      alpha(N)=(1+(0.37464+1.54226*omiga(N)-0.26992*omiga(N)**2)*SV)
      as(N)=((0.45724*R**2*Tc(N)**2)/Pc(N))*alpha(N)
      b(N)=0.07779*R*Tc(N)/Pc(N)
      beta(N)=b(N)*P/(R*T)
      q(N)=as(N)*alpha(N)*P/(R**2*T**2)
3     CONTINUE
C     运用牛顿迭代法开始求解压缩因子的方程
      T=298.0
      IF(N.LT.7.AND.N.GT.1)THEN
        ZM=1
        DO WHILE(.not.converged.and.ABS(MSD(ZM,beta(N),q(N))).GT.0)
        SSA=MS(ZM,beta(N),q(N))
        SSB=MSD(ZM,beta(N),q(N))
        ZM=ZM-SSA/SSB
        converged=(abs(SSA)/(SSB)).LT.EPS
        END DO
      ELSE
      END IF
      do 4 N=1,7
      Z1(N)=ZM
4     CONTINUE
C     求解密度和逸度
      DO 5 N=1,7
      I(N)=(1/(sigma-epsilon))*log((Z1(N)+sigma*beta(N))/
     *(Z1(N)+epsilon*beta(N)))
      rho(N)=(P/(Z1(N)*R*T))*M(N)*EPS
      faita(N)=SVF(Z1(N),beta,q(N),I(N))
5     CONTINUE

C     运用IAST理论以及上面得到的逸度系数,开始求解IAST的方程
      S=0
      X=1
      SSC=iast(X,P,y1,faita(1),faita(2))
      SSD=diast(X,P,y1,faita(1),faita(2))
      DO WHILE(.not.converged.and.ABS(SSD).GT.0)
      X=X-SSC/SSD
      S=S+1
      converged=(abs(SSC/SSD).LT.EPS)
      END DO
      x1=X
      f1=P*y1*faita(1)/x1
      f2=P*(1-y1)*faita(2)/(1-x1)
20    format(1x,3F9.4)
      write(20,*)f1,f2,x1
      end



      function MS(SA,SB,SC)
      MS=SA**3-(1-SB)*SA**2+(SC-2*SB-3*SB
     ***2)*SA-(SC*SB-SB**2-SB**3)
      end


      function MSD(SD,SE,SF)
      MSD=3*SD**2-2*(1-SE)*SD+(SF-2*SE-
     *3*SE**2)
      end


      function   iast(MADD,P,YY,SG1,SG2)
      dimension  ns(4),ma(4),K(4)
        REAL MADD
      DATA  ns/2.0,3.0,4.0,5.0/
      DATA ma/1.0,2.0,3.0,4.0/
      DATA K/5.0,6.0,7.0,8.0/
      f1=P*YY*SG1/MADD
      f2=P*(1-YY)*SG2/(1-MADD)
      iast=ns(1)*LOG(1+K(1)*f1**ma(1))+ns(2)*LOG
     *(1+K(2)*f1**ma(2))-ns(3)*LOG(1+K(3)*f2**ma(3))+ns(4)*LOG(1+
     *K(4)*f2**ma(4))
      end


      function  diast(MAD,S,Y,SG3,SG4)
      dimension  ns(4),ma(4),K(4)
        REAL MAD
      DATA  ns/2.0,3.0,4.0,5.0/
      data ma/1.0,2.0,3.0,4.0/
      data K/5.0,6.0,7.0,8.0/
      f1=S*Y*SG3/MAD
      f2=S*(1-Y)*SG4/(1-MAD)
      diast=(ma(1)*ns(1)*K(1)*f1*(ma(1)-1))/(1+
     *K(1)*f1**ma(1))+(ma(2)*ns(2)*K(2)*f1*(ma(2)-1))/(1+K(2)*f1**ma(2))
     *-(ma(3)*ns(3)*K(3)*f2*(ma(3)-1))/(1+K(3)*f2**ma(3))+
     *(ma(4)*ns(4)*K(4)*f2*(ma(4)-1))/(1+K(4)*f2**ma(4))
      END

      FUNCTION SVF(SG5,SG6,SG7,SG8)
      SVF=exp(SG5-1-log(SG5-SG6)-SG7*SG8)
      END
此程序没有错误和warning了,但是就是运行不出结果,我是COMPAQ VISUAL FORTRAN.
好好学习,天天向上。
14楼2010-07-11 20:51:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


resonant(金币+1):指导费:-) 2010-07-11 22:38:59
运行不出结果是什么意思?没有输出,还是别的?

你的这一部分有问题,我在前面的程序中其实改过了……
CODE:
20    format(1x,3F9.4)
      write(20,*)f1,f2,x1

另外,
CODE:
      IF(N.LT.7.AND.N.GT.1)THEN
        ZM=1
        DO WHILE(.not.converged.and.ABS(MSD(ZM,beta(N),q(N))).GT.0)
        SSA=MS(ZM,beta(N),q(N))
        SSB=MSD(ZM,beta(N),q(N))
        ZM=ZM-SSA/SSB
        converged=(abs(SSA)/(SSB)).LT.EPS
        END DO
      ELSE
      END IF

也有问题,一个是 N 在这里未定义,因为不在任何循环中,所以这部分代码根本就没有运行;第二,ELSE 之后没有语句了,如果的确没有,那么可以去掉。

其它的东西我就不懂了,那你的算法的问题了……
15楼2010-07-11 21:23:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


resonant(金币+1):指导费:-) 2010-07-11 22:39:13
另外,
CODE:
      SV=(1-(T/Tc(N))**(0.5))**2

这里的 T 未定义。程序中 converged 也未赋初始值。

Warning 还是有一些的,比如一些未使用的变量……
16楼2010-07-11 21:25:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)


resonant(金币+1):信息费:-) 2010-07-11 22:39:26
zyj8119(金币+10):怎么用CODE模式? 2010-07-12 02:46:22
大哥,最后再说一次,以后再贴程序,麻烦用 code 模式好不?
code 模式对于程序的阅读和拷贝有很大的帮助……
17楼2010-07-11 21:27:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zyj8119

木虫 (著名写手)

引用回帖:
Originally posted by snoopyzhao at 2010-07-11 21:27:38:
大哥,最后再说一次,以后再贴程序,麻烦用 code 模式好不?
code 模式对于程序的阅读和拷贝有很大的帮助……

CODE:
C     此程序是运用peng-robinson方程计算气体的逸度系数faita(1),faita(2),是利用牛顿迭代法求解
C     然后通过origin拟合得到这些数据N1,N2,m1,m2,K1,K2
C     求解得到f1,f2,x1的过程,首先利用牛顿迭代法求解IAST理论得到x1, 然后利用表达式求解f1,f2
      PROGRAM MAIN
      LOGICAL converged
      integer S N SQ
      parameter(EPS=1.0E-06,R=83.14,epsilon=1-2**(0.5),sigma=1+2**(0.5),N=7
     *)
      dimension faita(7),ns(4),ma(4),K(4),M(7),omiga(7),
     *Tc(7),Pc(7),b(7),beta(7),alpha(7),q(7),as(7),Z1(7)
      real alpha,beta,Tr,omiga,M,rho(7),q,a,b,SV,I(7),ZM,SSA,SSB,SSC,
     *SSD,T,f1,f2
      DATA M/16.043,30.070,44.097, 58.123,72.150, 44.01, 28.01/
      DATA omiga/0.012,0.100,0.152,0.2,0.252,0.224,0.048/
      DATA Tc/190.6,305.3,369.8,425.1,469.7,304.2,132.9/
      DATA Pc/45.99,48.72,42.48,37.96,33.70,73.83,34.99/
      READ(*,*)P1
C     计算peng-robinson方程中需要的一些参量
      DO 3 N=1,7
      P=P1/100
      SV=(1-(T/Tc(N))**(0.5))**2
      alpha(N)=(1+(0.37464+1.54226*omiga(N)-0.26992*omiga(N)**2)*SV)
      as(N)=((0.45724*R**2*Tc(N)**2)/Pc(N))*alpha(N)
      b(N)=0.07779*R*Tc(N)/Pc(N)
      beta(N)=b(N)*P/(R*T)
      q(N)=as(N)*alpha(N)*P/(R**2*T**2)
3     CONTINUE
C     运用牛顿迭代法开始求解压缩因子的方程
      T=298.0
      IF(N.LT.7.AND.N.GT.1)THEN
        ZM=1
        DO WHILE(.not.converged.and.ABS(MSD(ZM,beta(N),q(N))).GT.0)
        SSA=MS(ZM,beta(N),q(N))
        SSB=MSD(ZM,beta(N),q(N))
        ZM=ZM-SSA/SSB
        converged=(abs(SSA)/(SSB)).LT.EPS
        END DO
      ELSE
      END IF
      do 4 N=1,7
      Z1(N)=ZM
4     CONTINUE
C     求解密度和逸度
      DO 5 N=1,7
      I(N)=(1/(sigma-epsilon))*log((Z1(N)+sigma*beta(N))/
     *(Z1(N)+epsilon*beta(N)))
      rho(N)=(P/(Z1(N)*R*T))*M(N)*EPS
      faita(N)=SVF(Z1(N),beta,q(N),I(N))
5     CONTINUE

C     运用IAST理论以及上面得到的逸度系数,开始求解IAST的方程
      S=0
      X=1
      SSC=iast(X,P,y1,faita(1),faita(2))
      SSD=diast(X,P,y1,faita(1),faita(2))
      DO WHILE(.not.converged.and.ABS(SSD).GT.0)
      X=X-SSC/SSD
      S=S+1
      converged=(abs(SSC/SSD).LT.EPS)
      END DO
      x1=X
      f1=P*y1*faita(1)/x1
      f2=P*(1-y1)*faita(2)/(1-x1)
20    format(1x,3F9.4)
      write(20,*)f1,f2,x1
      end



      function MS(SA,SB,SC)
      MS=SA**3-(1-SB)*SA**2+(SC-2*SB-3*SB
     ***2)*SA-(SC*SB-SB**2-SB**3)
      end


      function MSD(SD,SE,SF)
      MSD=3*SD**2-2*(1-SE)*SD+(SF-2*SE-
     *3*SE**2)
      end


      function   iast(MADD,P,YY,SG1,SG2)
      dimension  ns(4),ma(4),K(4)
        REAL MADD
      DATA  ns/2.0,3.0,4.0,5.0/
      DATA ma/1.0,2.0,3.0,4.0/
      DATA K/5.0,6.0,7.0,8.0/
      f1=P*YY*SG1/MADD
      f2=P*(1-YY)*SG2/(1-MADD)
      iast=ns(1)*LOG(1+K(1)*f1**ma(1))+ns(2)*LOG
     *(1+K(2)*f1**ma(2))-ns(3)*LOG(1+K(3)*f2**ma(3))+ns(4)*LOG(1+
     *K(4)*f2**ma(4))
      end


      function  diast(MAD,S,Y,SG3,SG4)
      dimension  ns(4),ma(4),K(4)
        REAL MAD
      DATA  ns/2.0,3.0,4.0,5.0/
      data ma/1.0,2.0,3.0,4.0/
      data K/5.0,6.0,7.0,8.0/
      f1=S*Y*SG3/MAD
      f2=S*(1-Y)*SG4/(1-MAD)
      diast=(ma(1)*ns(1)*K(1)*f1*(ma(1)-1))/(1+
     *K(1)*f1**ma(1))+(ma(2)*ns(2)*K(2)*f1*(ma(2)-1))/(1+K(2)*f1**ma(2))
     *-(ma(3)*ns(3)*K(3)*f2*(ma(3)-1))/(1+K(3)*f2**ma(3))+
     *(ma(4)*ns(4)*K(4)*f2*(ma(4)-1))/(1+K(4)*f2**ma(4))
      END

      FUNCTION SVF(SG5,SG6,SG7,SG8)
      SVF=exp(SG5-1-log(SG5-SG6)-SG7*SG8)
      END

好好学习,天天向上。
18楼2010-07-12 02:49:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zyj8119

木虫 (著名写手)

引用回帖:
Originally posted by zyj8119 at 2010-07-12 02:49:10:


[code]C     此程序是运用peng-robinson方程计算气体的逸度系数faita(1),faita(2),是利用牛顿迭代法求解
C     然后通过origin拟合得到这些数据N1,N2,m1,m2,K1,K2
C     求解得到f1,f2,x1的过程,首先利用牛 ...

会了,谢谢提醒。。
好好学习,天天向上。
19楼2010-07-12 02:49:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zyj8119 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见