题目要求
设计程序,输入气温,通过给定的经验公式1和2 输出水汽压数值,并比较二者结果在数值上的差异,同时考察饱和水汽压与温度之间的关系。
所给定的经验公式如下
E
1
=
E
0
×
1
0
7.45
t
237.3
+
t
E_1=E_0\times10^{\frac{7.45t}{237.3+t}}
E1=E0×10237.3+t7.45t
E 2 = E 0 × e 16.67 t 243.5 + t E_2=E_0\times e^{\frac{16.67t}{243.5+t}} E2=E0×e243.5+t16.67t
题设分析
按照 “输入-执行-输出” 三步进行程序设计,首先审题:输入气温,代入公式,输出水汽压数值。
在Fortran中,该二者在IDE中的公式书写方式可以如下:
E1=E0*10**((7.45*t)/(237.3+t))
E2=E0*exp((17.67*t)/(243.5+t))
其中,
E
1
E_1
E1、
E
2
E_2
E2是题目给定的经验公式需要输出的水汽压值,
E
0
E_0
E0是给定的一个浮点数值,为6.11;A**B
在Fortran中为乘方运算符(双目);exp()
为
e
e
e指数函数,精度较高。
因此在程序设计中,由于温度的数值可以为整数,同时也可以为小数,因此我们需要定义一个实型变量 t t t,通过用户输入气温t的值,以进行后面的数据输出以及分析。
而在Fortran中,定义变量的语法如下
real A,B,C,D... !即:变量类型 变量名1,变量名2...
所以我们程序可以初步完成如下:
program main
implicit none
real e0,e1,e2,t !变量定义及初始化
e0=6.11
read *,t !程序正常运行
E1=E0*10**((7.45*t)/(237.3+t))
E2=E0*exp((17.67*t)/(243.5+t))
print *,'e1=',e1,'e2=',e2 !输出水汽压值
end program main
我们的程序设计初步如上,可以多次执行该程序,记录下运行结果,再进行分析。
但这样做,多次执行了同样的步骤,而这样的操作是较为浪费时间的,因此我们可以使用循环结构让计算机快速多次执行我们所需要的语句。
这里我们使用 do while()
语句来实现我们所需要的循环,do while ()
语句语法如下:
do while (循环退出条件)
循环体内语句
end do
例如:
do while (i.le.3)
print *,'f'
end do
控制台中将会出现三个 f 。
于是我们将前程序优化如下:
program mainn
implicit none
REAL e1,e2,e0,t
integer i !定义循环控制变量
i=0
e0=6.11
do while (i.le.5) !循环控制变量为5时退出循环
read *,t !读入用户输入数据
e1=e0*10**((7.45*t)/(237.3+t))
e2=e0*exp((17.67*t)/(243.5+t))
print *,'e1=',e1,'e2=',e2
i=i+1
end do
end program mainn
我们编译并运行上述程序,按一定梯度输入气温数据,可以得到程序运行的结果如下:
t t t | E 1 E_1 E1 | E 2 E_2 E2 |
---|---|---|
10 | 12.22 | 12.26 |
20 | 23.18 | 23.36 |
30 | 41.89 | 42.44 |
40 | 72.55 | 73.92 |
50 | 120.94 | 123.98 |
60 | 194.79 | 200.97 |
通过表格数据,不难发现,随着气温的升高, E 1 E_1 E1与 E 2 E_2 E2均有升高的趋势。
同时,我们也不难发现 E 1 E_1 E1与 E 2 E_2 E2之间存在数值上的差异,其中 E 1 E_1 E1小于 E 2 E_2 E2,并且输入的温度值越高,其差异越大。
我们可以利用一些数学绘图软件来进行两条经验公式的函数图像绘制。例如下图:
可以看到在低温状况下两条经验公式重合度较高,但随着温度的增加,两条曲线分岔渐大,说明二者差异随着温度的升高而不断加大。
(CSDN居然不支持Fortran,👴吐啦!)