气体p-V-T关系的编程计算摘要本文运用c语言编程的方法,解决化工热力学中的气体p-V-T关系的计算。
在化热力学气体p-V-T关系的计算过程中,有很多复杂的计算,有些需要进行复杂的小数计算,还有谢问题需要通过反复迭代才能得到结果。
在解决这些问题时通过编程计算成为大家选择的最佳途径之一。
本文系统的对这些程序做了汇集、汇编、整理,得到了可以直接应用的程序。
本程序充分考虑了人机语言转换的障碍,在人机交流的过程中会自动提示使用者进行操作:在输入数据时,会有输入格式说明等提示;在结果输出时,会把运算公式、计算迭代过程以及运算结果一并输出,方便使用者解决问题。
程序中使用的是C语言做计算,程序中使用了if,for,switch语句等基础函数语句和函数调用的基本方法,函数之间结合比较简单,使用者也可以按自己的需求自行改动函数语句。
本程序的主函数部分如下:#include<stdio.h>#include<math.h>void main( ){char fch,jg,sql;float p,V,T;int i,n;printf("欢迎进入物质p-V-T关系计算环境,程序正在编写中,欢迎交流学习!");printf("\n请输入所用方程和所求量。
\n公式代号说明:1 理想气体状态方程;2 维里方程;3 范德华方程;4 RK方程;5 SRK(RKS)方程。
\n所求量为p,V,T");printf("\n请输入所选方程代号fch=");scanf("%s",&fch);printf("\n请输入所求量sql=");scanf("%s",&sql); xzfch(fch,sql);}本文运用本文成功的解决了计算中遇到的大部分题。
在数值计算、迭代计算等复杂问题中得到了方便的应用。
程序能解决的问题如表一:表一:程序能解决的计算1.符号说明本程序在编写过程中使用了C 语言中通用的符号,在定义子函数及变量过程中使用的是汉语拼音中的生母标注法,具体标注如下:变量定义:p,V ,T,R--------气体的压强,体积,温度以及系数R ; sql--------------所求量; fch-------------使用的方程; 函数的定义:shrp(),shrV (),shrT ()---------在已知p,V ,T 的时候的输入函数;LX(),VL(),VDW(),RK(),SRK()--理想气体状态方程, 维里方程,范德华方程,RK 方程, SRK (RKS )方程。
2.程序汇编思路在程序编写过程中,遵循下列路径:3.使用要求及方法要求电脑安装Microsoft Visual C++程序软件。
使用时直接打开程序,依次点击运行按钮,按提示输入相关方程及数据即可。
运行界面如下:4.补充说明程序仍在开发编辑中,使用过程中如果发现任何问题,欢迎学习交流!附件:完整的程序如下:#include<stdio.h>#include<math.h>float p,V,T,R;R=8.314;/*输入函数库*/void shrp(){printf("\n请输入已知量V=");scanf("%f",&V);printf(" T=");scanf("%f",&T);}void shrV(){printf("\n请输入已知量p=");scanf("%f",&p);printf(" T=");scanf("%f",&T);}void shrT(){printf("\n请输入已知量p=");scanf("%f",&p);printf(" V=");scanf("%f",&V);}/*计算函数库*//*理想气体状态方程*/void LX(char sql){switch(sql){case'P':case'p':shrp();p=R*T/V;printf("\n计算公式为p=R*T/V\n所求量p=%f\n",p);break;case'V':case'v':shrV();V=T*R/p;printf("\n计算公式为V=T*R/p\n所求量V=%f\n",V);break;case'T':case't':shrT();T=p*V/R;printf("\n计算公式为T=p*V/R\n所求量T=%f\n",T);break;default:printf("\n\n输入所求量错误\n");}}/*维里方程*/void VL(char sql){float B,C,Z;float f[20],g[20];int i;f[0]=1;printf("\n请输入维里系数B=");scanf("%f",&B);printf("\n请输入维里系数(如果没有C请输入0) C=");scanf("%f",&C);if(C==0)switch(sql){case'P':case'p':shrp();Z=1+B/V;p=Z*R*T/V;printf("\n计算公式为\n Z=1+B/V;\np=Z*R*T/V;\n系数Z=%f\n所求量p=%f\n",Z,p);break;case'V':case'v':shrV();Z=1+B*p/R/T;V=Z*T*R/p;printf("\n计算公式为\n Z=1+B*p/R/T;\nV=Z*T*R/p; \n系数Z=%f\n所求量V=%f\n",Z,V);break;default:printf("\n\n输入所求量错误\n ");}if(C!=0)switch(sql){case'P':case'p':shrp();Z=1+B/V+C/V/V;p=Z*R*T/V;printf("\n计算公式为\n Z=1+B/V+C/V/V;\np=Z*R*T/V;\n系数Z=%f\n所求量p=%f\n",p);break;case'V':case'v':shrV();for(i=0;i<20;i++){g[i]=R*T/p*f[i];f[i+1]=1+B/g[i]+C/g[i]/g[i];if(f[i+1]-f[i]>-1e-6&& f[i+1]-f[i]<1e-6)break;}Z=f[i+1];V=Z*T*R/p;printf("\n第%d次计算后,\nZ%d=%f;\nV%d=%f;",i,i,f[i+1],i,g[i]);printf("\n计算公式为\n V[i]=R*T/p*Z[i];\nV[i]=R*T/p*Z[i];Z[i+1]=1+B/g[i]+C/g[i]/g[i]; \n系数Z=%f\n所求量V=%f",Z,V);break;default:printf("\n\n输入所求量错误\n");}}/*范德华方程*/void VDW(char sql){float a,b;printf("\n请输入相关参数a=");scanf("%f",&a);printf("\n请输入相关参数b=");scanf("%f",&b);switch(sql){case'P':case'p':shrp();p=R*T/(V-b)-a/V/V;printf("\n计算公式为\n p=R*T/(V-b)-a/V/V;\n所求量p=%f\n",p);break;case'V':case'v':printf("\n\n无相关公式");break;default:printf("\n\n输入所求量错误");}}/*RK方程*/void RK(char sql){float Tc,Pc,Z,a,b,A,B;float f[20],g[20];int i;f[0]=1;printf("\n请输入相关参数Tc=");scanf("%f",&Tc);printf("\n请输入相关参数Pc=");scanf("%f",&Pc);a=0.42748*R*R*Tc*Tc*sqrt(Tc)/Pc;b=0.08664*R*Tc/Pc;switch(sql){case'P':case'p':shrp();p=R*T/(V-b)-a/sqrt(T)/V/(V+b);printf("\n计算公式为\n p=R*T/(V-b)-a/sqrt(T)/V/(V+b);\n所求量p=%f\n",p);break;case'V':case'v':shrV();A=a*p/R/R/T/T/sqrt(T);B=b*p/R/T;for(i=0;i<20;i++){g[i]=B/f[i];f[i+1]=1/(1-g[i])-A/B*g[i]/(1+g[i]);printf("\n第%d次计算后,\nZ%d=%f;\nh%d=%f;",i,i,f[i+1],i,g[i]);if(f[i+1]-f[i]>-1e-6&& f[i+1]-f[i]<1e-6)break;}Z=f[i+1];V=Z*T*R/p;printf("\n计算公式为\n h[i]=B/Z[i];\nZ[i+1]=1/(1-h[i])-A/B*h[i]/(1+h[i]);\n系数A=%f\n系数B=%f\n系数Z=%f\n所求量V=%f\n",A,B,Z,V);break;default:printf("\n\n输入所求量错误\n");}}/*SRK(KRS)方程*/void SRK(char sql){float Tc,Pc,Tr,a,b,A,B,w,m,K;float f[20],g[20];int i;f[0]=1;printf("\n请输入相关参数Tc=");scanf("%f",&Tc);printf("\n请输入相关参数Pc=");scanf("%f",&Pc);printf("\n请输入相关参数w=");scanf("%f",&w);a=0.42748*R*R*Tc*Tc*sqrt(Tc)/Pc;b=0.08664*R*Tc/Pc;switch(sql){case'P':case'p':shrp();Tr=T/Tc;m=0.480+1.574*w-0.176*w*w;K=a*(1+m*(1-sqrt(Tc)))* (1+m*(1-sqrt(Tc)));p=R*T/(V-b)-K/V/(V+b);printf("\n计算公式为\n p=R*T/(V-b)-a/ V/(V+b);\n系数a=%f\n系数b=%f\n系数Tr=%f\n系数K=%f\n所求量p=%f\n",a,b,Tr,K,p);break;case'V':case'v':shrV();A=a*p/R/R/T/T;B=b*p/R/T;/*for(i=0;i<20;i++){g[i]=B/f[i];f[i+1]=1/(1-g[i])-A/B*g[i]/(1+g[i]);if(f[i+1]-f[i]>-1e-6&& f[i+1]-f[i]<1e-6)printf("\n第%d次计算后,\nZ%d=%f;\nh%d=%f;",i,i,f[i+1],i,g[i]);break;}Z=f[i+1];V=Z*T*R/p;*/printf("\n计算公式为\n h[i]=B/Z[i];Z[i+1]=1/(1-h[i])-A/B*h[i]/(1+h[i]);\n所求量V=%f\n",V);break;default:printf("\n\n输入所求量错误\n");}}/*主函数*/void main( ){char fch,jg,sql;int i,n;printf("欢迎进入物质p-V-T关系计算环境,程序正在开发中,欢迎交流学习!");printf("\n请输入所用方程和所求量。