对分发迭代法牛顿法RKSRK方程.docx
《对分发迭代法牛顿法RKSRK方程.docx》由会员分享,可在线阅读,更多相关《对分发迭代法牛顿法RKSRK方程.docx(16页珍藏版)》请在冰豆网上搜索。
对分发迭代法牛顿法RKSRK方程
对分法SRK方程
#include
#include
#defineR8.314
floatfun(floatA,floatB,floatZ)
{
floatfz;
fz=pow(Z,3)-pow(Z,2)+(A-B-B*B)*Z-A*B;
returnfz;
}
main()
{
inti=1;
floatp0,t0,w,p1,t1,h,Z0,Z1,Z2;
floata,b,m,A,B,t2,at,y,y1,y2;
a=b=0.0;
printf("请输入临界参数:
\np0=");
scanf("%f",&p0);
printf("请输入临界参数:
\nt0=");
scanf("%f",&t0);
printf("请输入偏心因子:
\nw=");
scanf("%f",&w);
printf("请输入实际温度:
\nt1=");
scanf("%f",&t1);
printf("请输入实际压力:
\np1=");
scanf("%f",&p1);
m=0.480+1.574*w-0.176*w*w;
t2=t1/t0;
at=(1+m*(1-sqrt(t2)))*(1+m*(1-sqrt(t2)));
a=0.42748*R*R*pow(t0,2)/p0*at;
b=0.08664*R*t0/p0;
A=a*p1/(R*R*pow(t1,2));
B=b*p1/(R*t1);
Z1=0.0;Z2=3.0;
y1=fun(A,B,Z1);
y2=fun(A,B,Z2);
printf("第0次计算结果y1=%.6fy2=%.6fZ1=%.5fZ2=%.5f\n",y1,y2,Z1,Z2);
do
{
Z0=(Z1+Z2)/2;
y=fun(A,B,Z0);
if(y>0)
{y2=y;Z2=Z0;}
if(y<0)
{y1=y;Z1=Z0;}
if(y=0)
{Z1=Z0;break;}
printf("第%-2d次计算结果y1=%.6fy2=%.6fZ1=%.5fZ2=%.5f\n",i,y1,y2,Z1,Z2);
i++;
}
while((fabs(Z1-Z2))>0.0001);
printf("\n");
printf("共经过%d次计算,求得压缩因子为Z=%.5f\n",--i,Z1);
}
对分法RK方程1
#include
#include
#defineR8.314
#definet0126.2
#definep03394000.0
#definew0.04
floatfun(floatA,floatB,floatZ)
{
floatfz;
fz=pow(Z,3)-pow(Z,2)+(A-B-B*B)*Z-A*B;
returnfz;
}
main()
{
inti=1;
floatp1,t1,Z0,Z1,Z2;
floata,b,A,B,t2,y,y1,y2;
a=b=0.0;
printf("氨的临界压力p0=%.1f\n",p0);
printf("氨的临界温度t0=%.1f\n",t0);
printf("氨的偏心因子w=%.2f\n",w);
printf("请输入实际温度:
\nt1=");
scanf("%f",&t1);
printf("请输入实际压力:
\np1=");
scanf("%f",&p1);
a=0.42748*R*R*pow(t0,2)/p0;
b=0.08664*R*t0/p0;
A=a*p1/(R*R*pow(t1,2));
B=b*p1/(R*t1);
Z1=0.0;Z2=3.0;
y1=fun(A,B,Z1);
y2=fun(A,B,Z2);
printf("第0次计算结果y1=%.6fy2=%.6fZ1=%.5fZ2=%.5f\n",y1,y2,Z1,Z2);
do
{
Z0=(Z1+Z2)/2;
y=fun(A,B,Z0);
if(y>0)
{y2=y;Z2=Z0;}
if(y<0)
{y1=y;Z1=Z0;}
if(y=0)
{Z1=Z0;break;}
printf("第%-2d次计算结果y1=%.6fy2=%.6fZ1=%.5fZ2=%.5f\n",i,y1,y2,Z1,Z2);
i++;
}
while((fabs(Z1-Z2))>0.0001);
printf("\n");
printf("共经过%d次计算,求得压缩因子为Z=%.5f\n",--i,Z1);
}
对分法RK方程2
#include
#include
#defineR8.314
#definet0126.2
#definep03394000.0
#definew0.04
floatfun(floatA,floatB,floatZ)
{
floatfz;
fz=pow(Z,3)-pow(Z,2)+(A-B-B*B)*Z-A*B;
returnfz;
}
main()
{
inti=1;
floatp1,t1,h,Z0,Z1,Z2;
floata,b,m,A,B,t2,at,y,y1,y2;
a=b=0.0;
printf("氨的临界压力p0=%.1f\n",p0);
printf("氨的临界温度t0=%.1f\n",t0);
printf("氨的偏心因子w=%.2f\n",w);
printf("请输入实际温度:
\nt1=");
scanf("%f",&t1);
printf("请输入实际压力:
\np1=");
scanf("%f",&p1);
m=0.480+1.574*w-0.176*w*w;
t2=t1/t0;
at=(1+m*(1-sqrt(t2)))*(1+m*(1-sqrt(t2)));
a=0.42748*R*R*pow(t0,2)/p0*at;
b=0.08664*R*t0/p0;
A=a*p1/(R*R*pow(t1,2));
B=b*p1/(R*t1);
Z1=0.0;Z2=3.0;
y1=fun(A,B,Z1);
y2=fun(A,B,Z2);
printf("第0次计算结果y1=%.6fy2=%.6fZ1=%.5fZ2=%.5f\n",y1,y2,Z1,Z2);
do
{
Z0=(Z1+Z2)/2;
y=fun(A,B,Z0);
if(y>0)
{y2=y;Z2=Z0;}
if(y<0)
{y1=y;Z1=Z0;}
if(y=0)
{Z1=Z0;break;}
printf("第%-2d次计算结果y1=%.6fy2=%.6fZ1=%.5fZ2=%.5f\n",i,y1,y2,Z1,Z2);
i++;
}
while((fabs(Z1-Z2))>0.0001);
printf("\n");
printf("共经过%d次计算,求得压缩因子为Z=%.5f\n",--i,Z1);
}
迭代法RK方程
#include
#include
#defineR8.314
floatfun(floatA,floatB,floath)
{
floatZ;
Z=1.0/(1-h)-A/B*(h/(1+h));
returnZ;
}
main()
{
inti=1;
floatp0,t0,w,p1,t1,h,Z0;
floata,b,A,B,Z;
a=b=0.0;
printf("请输入临界参数:
\np0=");
scanf("%f",&p0);
printf("请输入临界参数:
\nt0=");
scanf("%f",&t0);
printf("请输入偏心因子:
\nw=");
scanf("%f",&w);
printf("请输入实际温度:
\nt1=");
scanf("%f",&t1);
printf("请输入实际压力:
\np1=");
scanf("%f",&p1);
a=0.42748*R*R*pow(t0,2.5)/p0;
b=0.08664*R*t0/p0;
A=a*p1/(R*R*pow(t1,2.5));
B=b*p1/(R*t1);
printf("请输入Z的迭代初值:
\nZ=");
scanf("%f",&Z);
do
{
Z0=Z;
h=B/Z0;
Z=fun(A,B,h);
printf("第%d次迭代%f%f\n",i,Z,h);
i++;
}
while((fabs(Z-Z0))>0.0001);
printf("\n");
printf("共经过%d次迭代,求得压缩因子为w=%f\n",--i,Z);
}
迭代法SRK方程
#include
#include
#defineR8.314
floatfun(floatA,floatB,floath)
{
floatZ;
Z=1.0/(1-h)-A/B*(h/(1+h));
returnZ;
}
main()
{
inti=1;
floatp0,t0,w,p1,t1,h,Z0;
floata,b,m,A,B,Z,t2,ft;
a=b=0.0;
printf("请输入临界参数:
\np0=");
scanf("%f",&p0);
printf("请输入临界参数:
\nt0=");
scanf("%f",&t0);
printf("请输入偏心因子:
\nw=");
scanf("%f",&w);
printf("请输入实际温度:
\nt1=");
scanf("%f",&t1);
printf("请输入实际压力:
\np1=");
scanf("%f",&p1);
m=0.480+1.574*w-0.176*w*w;
t2=t1/t0;
ft=(1+m*(1-sqrt(t2)))*(1+m*(1-sqrt(t2)));
a=0.42748*R*R*pow(t0,2)/p0*ft;
b=0.08664*R*t0/p0;
A=a*p1/(R*R*pow(t1,2));
B=b*p1/(R*t1);
printf("请输入Z的迭代初值:
\nZ=");
scanf("%f",&Z);
h=B/Z;
printf("第0次迭代%.4f%.5f\n",Z,h);
do
{
Z0=Z;
Z=fun(A,B,h);
h=B/Z;
printf("第%d次迭