Function 普朗克&x27;fortran90中的s函数
在Fortran 90中,我有一个函数的公式,用来计算给定波长和温度下的光谱辐射。我将其表述为:Function 普朗克&x27;fortran90中的s函数,function,fortran,infinity,Function,Fortran,Infinity,在Fortran 90中,我有一个函数的公式,用来计算给定波长和温度下的光谱辐射。我将其表述为: intensity = (2.0d0*h*nu**(3.0d0))/c**(2.0d0) * 1d0 / (EXP((h*nu)/(k*T))-1d0) 我把波长作为参数,然后转换成nu。当我的波长趋于无限时,Fortran开始说强度是无限的,返回Inf。然而,当波长趋于无穷大时,普朗克函数收敛到0。为什么会这样 我的理论是,也许,因为nu=c/lambda,当lambda趋于无穷大时,函数的一部
intensity = (2.0d0*h*nu**(3.0d0))/c**(2.0d0) * 1d0 / (EXP((h*nu)/(k*T))-1d0)
我把波长作为参数,然后转换成nu。当我的波长趋于无限时,Fortran开始说强度是无限的,返回Inf
。然而,当波长趋于无穷大时,普朗克函数收敛到0。为什么会这样
我的理论是,也许,因为nu=c/lambda,当lambda趋于无穷大时,函数的一部分被0除,所以它趋于无穷大。然而,波长也有一个-5的幂律,这意味着总的来说函数收敛于0,但Fortran的计算似乎不是这样。为什么会这样?怎么了?它本质上是说零次Inf
是Inf.
作为记录,我不认为提交代码块在这里很重要——这是一个练习的一部分,在练习中会出现这个问题,所以我知道我的代码没有出现故障 我认为这是因为分母中的exp(x)-1对于非常小的x(cf.),正好变成0(双精度),而对于相同的x,分子保持非零
program main
implicit none
integer, parameter :: dp = kind(0.0d0)
real(dp) :: nu, h, kT, ana, lim, numer, denom, expfac
h = 0.8d0; kT = 1.2d0
nu = 1.0d0
do while ( nu > 1.0d-20 )
expfac = exp((h * nu) / kT)
numer = 2.0d0 * h * nu**3 ! (nu**3.0d0 also works but nu**3 is recommended)
denom = expfac - 1.0d0
!! Intensity (analytical & limiting expressions).
ana = numer / denom
lim = 2.0d0 * nu**2 * kT !! use exp(x) ~ 1 + x
print "(5(2x,a,es9.2),2x,a,es24.17)", &
"nu=", nu, "ana=", ana, "lim=", lim, &
"numer=", numer, "denom=", denom, "exp=", expfac
nu = nu / 2.0d0
enddo
end
结果(gfortran-9)
根据经验,exp(x)-1(对于小x)可以以更稳定的方式评估为2*tanh(x/2)/(1-tanh(x/2))。后一种表达似乎确实改善了结果
program main
implicit none
integer, parameter :: dp = kind(0.0d0)
real(dp) :: nu, h, kT, ana, lim, numer, denom, expfac, x
h = 0.8d0; kT = 1.2d0
nu = 1.0d0
do while ( nu > 1.0d-20 )
x = h * nu / kT
numer = 2.0d0 * h * nu**3
denom = (2 * tanh(x / 2)) / (1 - tanh(x / 2))
ana = numer / denom
lim = 2.0d0 * nu**2 * kT
print "(5(2x,a,es9.2))", &
"nu=", nu, "ana=", ana, "lim=", lim, &
"numer=", numer, "denom=", denom
nu = nu / 2.0d0
enddo
end
结果:
nu= 1.00E+00 ana= 1.69E+00 lim= 2.40E+00 numer= 1.60E+00 denom= 9.48E-01
nu= 5.00E-01 ana= 5.06E-01 lim= 6.00E-01 numer= 2.00E-01 denom= 3.96E-01
nu= 2.50E-01 ana= 1.38E-01 lim= 1.50E-01 numer= 2.50E-02 denom= 1.81E-01
nu= 1.25E-01 ana= 3.60E-02 lim= 3.75E-02 numer= 3.13E-03 denom= 8.69E-02
nu= 6.25E-02 ana= 9.18E-03 lim= 9.37E-03 numer= 3.91E-04 denom= 4.25E-02
nu= 3.12E-02 ana= 2.32E-03 lim= 2.34E-03 numer= 4.88E-05 denom= 2.11E-02
nu= 1.56E-02 ana= 5.83E-04 lim= 5.86E-04 numer= 6.10E-06 denom= 1.05E-02
nu= 7.81E-03 ana= 1.46E-04 lim= 1.46E-04 numer= 7.63E-07 denom= 5.22E-03
nu= 3.91E-03 ana= 3.66E-05 lim= 3.66E-05 numer= 9.54E-08 denom= 2.61E-03
nu= 1.95E-03 ana= 9.15E-06 lim= 9.16E-06 numer= 1.19E-08 denom= 1.30E-03
nu= 9.77E-04 ana= 2.29E-06 lim= 2.29E-06 numer= 1.49E-09 denom= 6.51E-04
nu= 4.88E-04 ana= 5.72E-07 lim= 5.72E-07 numer= 1.86E-10 denom= 3.26E-04
nu= 2.44E-04 ana= 1.43E-07 lim= 1.43E-07 numer= 2.33E-11 denom= 1.63E-04
nu= 1.22E-04 ana= 3.58E-08 lim= 3.58E-08 numer= 2.91E-12 denom= 8.14E-05
nu= 6.10E-05 ana= 8.94E-09 lim= 8.94E-09 numer= 3.64E-13 denom= 4.07E-05
nu= 3.05E-05 ana= 2.24E-09 lim= 2.24E-09 numer= 4.55E-14 denom= 2.03E-05
nu= 1.53E-05 ana= 5.59E-10 lim= 5.59E-10 numer= 5.68E-15 denom= 1.02E-05
nu= 7.63E-06 ana= 1.40E-10 lim= 1.40E-10 numer= 7.11E-16 denom= 5.09E-06
nu= 3.81E-06 ana= 3.49E-11 lim= 3.49E-11 numer= 8.88E-17 denom= 2.54E-06
nu= 1.91E-06 ana= 8.73E-12 lim= 8.73E-12 numer= 1.11E-17 denom= 1.27E-06
nu= 9.54E-07 ana= 2.18E-12 lim= 2.18E-12 numer= 1.39E-18 denom= 6.36E-07
nu= 4.77E-07 ana= 5.46E-13 lim= 5.46E-13 numer= 1.73E-19 denom= 3.18E-07
nu= 2.38E-07 ana= 1.36E-13 lim= 1.36E-13 numer= 2.17E-20 denom= 1.59E-07
nu= 1.19E-07 ana= 3.41E-14 lim= 3.41E-14 numer= 2.71E-21 denom= 7.95E-08
nu= 5.96E-08 ana= 8.53E-15 lim= 8.53E-15 numer= 3.39E-22 denom= 3.97E-08
nu= 2.98E-08 ana= 2.13E-15 lim= 2.13E-15 numer= 4.24E-23 denom= 1.99E-08
nu= 1.49E-08 ana= 5.33E-16 lim= 5.33E-16 numer= 5.29E-24 denom= 9.93E-09
nu= 7.45E-09 ana= 1.33E-16 lim= 1.33E-16 numer= 6.62E-25 denom= 4.97E-09
nu= 3.73E-09 ana= 3.33E-17 lim= 3.33E-17 numer= 8.27E-26 denom= 2.48E-09
nu= 1.86E-09 ana= 8.33E-18 lim= 8.33E-18 numer= 1.03E-26 denom= 1.24E-09
nu= 9.31E-10 ana= 2.08E-18 lim= 2.08E-18 numer= 1.29E-27 denom= 6.21E-10
nu= 4.66E-10 ana= 5.20E-19 lim= 5.20E-19 numer= 1.62E-28 denom= 3.10E-10
nu= 2.33E-10 ana= 1.30E-19 lim= 1.30E-19 numer= 2.02E-29 denom= 1.55E-10
nu= 1.16E-10 ana= 3.25E-20 lim= 3.25E-20 numer= 2.52E-30 denom= 7.76E-11
nu= 5.82E-11 ana= 8.13E-21 lim= 8.13E-21 numer= 3.16E-31 denom= 3.88E-11
nu= 2.91E-11 ana= 2.03E-21 lim= 2.03E-21 numer= 3.94E-32 denom= 1.94E-11
nu= 1.46E-11 ana= 5.08E-22 lim= 5.08E-22 numer= 4.93E-33 denom= 9.70E-12
nu= 7.28E-12 ana= 1.27E-22 lim= 1.27E-22 numer= 6.16E-34 denom= 4.85E-12
nu= 3.64E-12 ana= 3.18E-23 lim= 3.18E-23 numer= 7.70E-35 denom= 2.43E-12
nu= 1.82E-12 ana= 7.94E-24 lim= 7.94E-24 numer= 9.63E-36 denom= 1.21E-12
nu= 9.09E-13 ana= 1.99E-24 lim= 1.99E-24 numer= 1.20E-36 denom= 6.06E-13
nu= 4.55E-13 ana= 4.96E-25 lim= 4.96E-25 numer= 1.50E-37 denom= 3.03E-13
nu= 2.27E-13 ana= 1.24E-25 lim= 1.24E-25 numer= 1.88E-38 denom= 1.52E-13
nu= 1.14E-13 ana= 3.10E-26 lim= 3.10E-26 numer= 2.35E-39 denom= 7.58E-14
nu= 5.68E-14 ana= 7.75E-27 lim= 7.75E-27 numer= 2.94E-40 denom= 3.79E-14
nu= 2.84E-14 ana= 1.94E-27 lim= 1.94E-27 numer= 3.67E-41 denom= 1.89E-14
nu= 1.42E-14 ana= 4.85E-28 lim= 4.85E-28 numer= 4.59E-42 denom= 9.47E-15
nu= 7.11E-15 ana= 1.21E-28 lim= 1.21E-28 numer= 5.74E-43 denom= 4.74E-15
nu= 3.55E-15 ana= 3.03E-29 lim= 3.03E-29 numer= 7.17E-44 denom= 2.37E-15
nu= 1.78E-15 ana= 7.57E-30 lim= 7.57E-30 numer= 8.97E-45 denom= 1.18E-15
nu= 8.88E-16 ana= 1.89E-30 lim= 1.89E-30 numer= 1.12E-45 denom= 5.92E-16
nu= 4.44E-16 ana= 4.73E-31 lim= 4.73E-31 numer= 1.40E-46 denom= 2.96E-16
nu= 2.22E-16 ana= 1.18E-31 lim= 1.18E-31 numer= 1.75E-47 denom= 1.48E-16
nu= 1.11E-16 ana= 2.96E-32 lim= 2.96E-32 numer= 2.19E-48 denom= 7.40E-17
nu= 5.55E-17 ana= 7.40E-33 lim= 7.40E-33 numer= 2.74E-49 denom= 3.70E-17
nu= 2.78E-17 ana= 1.85E-33 lim= 1.85E-33 numer= 3.42E-50 denom= 1.85E-17
nu= 1.39E-17 ana= 4.62E-34 lim= 4.62E-34 numer= 4.28E-51 denom= 9.25E-18
nu= 6.94E-18 ana= 1.16E-34 lim= 1.16E-34 numer= 5.35E-52 denom= 4.63E-18
nu= 3.47E-18 ana= 2.89E-35 lim= 2.89E-35 numer= 6.68E-53 denom= 2.31E-18
nu= 1.73E-18 ana= 7.22E-36 lim= 7.22E-36 numer= 8.35E-54 denom= 1.16E-18
nu= 8.67E-19 ana= 1.81E-36 lim= 1.81E-36 numer= 1.04E-54 denom= 5.78E-19
nu= 4.34E-19 ana= 4.51E-37 lim= 4.51E-37 numer= 1.31E-55 denom= 2.89E-19
nu= 2.17E-19 ana= 1.13E-37 lim= 1.13E-37 numer= 1.63E-56 denom= 1.45E-19
nu= 1.08E-19 ana= 2.82E-38 lim= 2.82E-38 numer= 2.04E-57 denom= 7.23E-20
nu= 5.42E-20 ana= 7.05E-39 lim= 7.05E-39 numer= 2.55E-58 denom= 3.61E-20
nu= 2.71E-20 ana= 1.76E-39 lim= 1.76E-39 numer= 3.19E-59 denom= 1.81E-20
nu= 1.36E-20 ana= 4.41E-40 lim= 4.41E-40 numer= 3.98E-60 denom= 9.04E-21
我认为堆栈交换“数学”可能更适合于此。我不同意。从数学上讲,这个函数应该收敛到0,但不是专门使用FORTRAN。语言的名称是FORTRAN。自1990年以来,它就没有被拼写为FORTRAN。你为什么要用1d0乘以分子?为什么要使用
实数
值指数。这可能是你的问题,因为nu**(3.d0)
很可能被评估为exp(3.d0*log(nu))
“作为记录,我不认为提交代码块在这里很重要——这是这个问题出现的练习的一部分,所以我知道我的代码没有故障。”所以你想让我们解决你的家庭作业吗?但是,即使没有完整的MWE,也很难说为什么函数会发散。您可能有兴趣使用分子中的零呢?对于小'nu',分子保持非零(请参见输出中的“numer=”),但对于非常小的'nu',分母变为零(因为exp(x)-1),也就是说,我认为分母比分子损失精度更快,因为分母是1阶值的差(如果x非常小)。我认为问题中的句子“它本质上是说零乘以Inf就是Inf”是造成混淆的原因。如果表达式接近0/0(这类似于可移动奇点,类似于sin(x)/x),我们就不能在表达式中将x精确设置为零。但是限制x->eps(一个小但非零的数字)可能会受到浮点数精度的限制(分母就是这种情况)。我认为这个问题不是Fortran特有的,但在其他语言中也会出现。
nu= 1.00E+00 ana= 1.69E+00 lim= 2.40E+00 numer= 1.60E+00 denom= 9.48E-01
nu= 5.00E-01 ana= 5.06E-01 lim= 6.00E-01 numer= 2.00E-01 denom= 3.96E-01
nu= 2.50E-01 ana= 1.38E-01 lim= 1.50E-01 numer= 2.50E-02 denom= 1.81E-01
nu= 1.25E-01 ana= 3.60E-02 lim= 3.75E-02 numer= 3.13E-03 denom= 8.69E-02
nu= 6.25E-02 ana= 9.18E-03 lim= 9.37E-03 numer= 3.91E-04 denom= 4.25E-02
nu= 3.12E-02 ana= 2.32E-03 lim= 2.34E-03 numer= 4.88E-05 denom= 2.11E-02
nu= 1.56E-02 ana= 5.83E-04 lim= 5.86E-04 numer= 6.10E-06 denom= 1.05E-02
nu= 7.81E-03 ana= 1.46E-04 lim= 1.46E-04 numer= 7.63E-07 denom= 5.22E-03
nu= 3.91E-03 ana= 3.66E-05 lim= 3.66E-05 numer= 9.54E-08 denom= 2.61E-03
nu= 1.95E-03 ana= 9.15E-06 lim= 9.16E-06 numer= 1.19E-08 denom= 1.30E-03
nu= 9.77E-04 ana= 2.29E-06 lim= 2.29E-06 numer= 1.49E-09 denom= 6.51E-04
nu= 4.88E-04 ana= 5.72E-07 lim= 5.72E-07 numer= 1.86E-10 denom= 3.26E-04
nu= 2.44E-04 ana= 1.43E-07 lim= 1.43E-07 numer= 2.33E-11 denom= 1.63E-04
nu= 1.22E-04 ana= 3.58E-08 lim= 3.58E-08 numer= 2.91E-12 denom= 8.14E-05
nu= 6.10E-05 ana= 8.94E-09 lim= 8.94E-09 numer= 3.64E-13 denom= 4.07E-05
nu= 3.05E-05 ana= 2.24E-09 lim= 2.24E-09 numer= 4.55E-14 denom= 2.03E-05
nu= 1.53E-05 ana= 5.59E-10 lim= 5.59E-10 numer= 5.68E-15 denom= 1.02E-05
nu= 7.63E-06 ana= 1.40E-10 lim= 1.40E-10 numer= 7.11E-16 denom= 5.09E-06
nu= 3.81E-06 ana= 3.49E-11 lim= 3.49E-11 numer= 8.88E-17 denom= 2.54E-06
nu= 1.91E-06 ana= 8.73E-12 lim= 8.73E-12 numer= 1.11E-17 denom= 1.27E-06
nu= 9.54E-07 ana= 2.18E-12 lim= 2.18E-12 numer= 1.39E-18 denom= 6.36E-07
nu= 4.77E-07 ana= 5.46E-13 lim= 5.46E-13 numer= 1.73E-19 denom= 3.18E-07
nu= 2.38E-07 ana= 1.36E-13 lim= 1.36E-13 numer= 2.17E-20 denom= 1.59E-07
nu= 1.19E-07 ana= 3.41E-14 lim= 3.41E-14 numer= 2.71E-21 denom= 7.95E-08
nu= 5.96E-08 ana= 8.53E-15 lim= 8.53E-15 numer= 3.39E-22 denom= 3.97E-08
nu= 2.98E-08 ana= 2.13E-15 lim= 2.13E-15 numer= 4.24E-23 denom= 1.99E-08
nu= 1.49E-08 ana= 5.33E-16 lim= 5.33E-16 numer= 5.29E-24 denom= 9.93E-09
nu= 7.45E-09 ana= 1.33E-16 lim= 1.33E-16 numer= 6.62E-25 denom= 4.97E-09
nu= 3.73E-09 ana= 3.33E-17 lim= 3.33E-17 numer= 8.27E-26 denom= 2.48E-09
nu= 1.86E-09 ana= 8.33E-18 lim= 8.33E-18 numer= 1.03E-26 denom= 1.24E-09
nu= 9.31E-10 ana= 2.08E-18 lim= 2.08E-18 numer= 1.29E-27 denom= 6.21E-10
nu= 4.66E-10 ana= 5.20E-19 lim= 5.20E-19 numer= 1.62E-28 denom= 3.10E-10
nu= 2.33E-10 ana= 1.30E-19 lim= 1.30E-19 numer= 2.02E-29 denom= 1.55E-10
nu= 1.16E-10 ana= 3.25E-20 lim= 3.25E-20 numer= 2.52E-30 denom= 7.76E-11
nu= 5.82E-11 ana= 8.13E-21 lim= 8.13E-21 numer= 3.16E-31 denom= 3.88E-11
nu= 2.91E-11 ana= 2.03E-21 lim= 2.03E-21 numer= 3.94E-32 denom= 1.94E-11
nu= 1.46E-11 ana= 5.08E-22 lim= 5.08E-22 numer= 4.93E-33 denom= 9.70E-12
nu= 7.28E-12 ana= 1.27E-22 lim= 1.27E-22 numer= 6.16E-34 denom= 4.85E-12
nu= 3.64E-12 ana= 3.18E-23 lim= 3.18E-23 numer= 7.70E-35 denom= 2.43E-12
nu= 1.82E-12 ana= 7.94E-24 lim= 7.94E-24 numer= 9.63E-36 denom= 1.21E-12
nu= 9.09E-13 ana= 1.99E-24 lim= 1.99E-24 numer= 1.20E-36 denom= 6.06E-13
nu= 4.55E-13 ana= 4.96E-25 lim= 4.96E-25 numer= 1.50E-37 denom= 3.03E-13
nu= 2.27E-13 ana= 1.24E-25 lim= 1.24E-25 numer= 1.88E-38 denom= 1.52E-13
nu= 1.14E-13 ana= 3.10E-26 lim= 3.10E-26 numer= 2.35E-39 denom= 7.58E-14
nu= 5.68E-14 ana= 7.75E-27 lim= 7.75E-27 numer= 2.94E-40 denom= 3.79E-14
nu= 2.84E-14 ana= 1.94E-27 lim= 1.94E-27 numer= 3.67E-41 denom= 1.89E-14
nu= 1.42E-14 ana= 4.85E-28 lim= 4.85E-28 numer= 4.59E-42 denom= 9.47E-15
nu= 7.11E-15 ana= 1.21E-28 lim= 1.21E-28 numer= 5.74E-43 denom= 4.74E-15
nu= 3.55E-15 ana= 3.03E-29 lim= 3.03E-29 numer= 7.17E-44 denom= 2.37E-15
nu= 1.78E-15 ana= 7.57E-30 lim= 7.57E-30 numer= 8.97E-45 denom= 1.18E-15
nu= 8.88E-16 ana= 1.89E-30 lim= 1.89E-30 numer= 1.12E-45 denom= 5.92E-16
nu= 4.44E-16 ana= 4.73E-31 lim= 4.73E-31 numer= 1.40E-46 denom= 2.96E-16
nu= 2.22E-16 ana= 1.18E-31 lim= 1.18E-31 numer= 1.75E-47 denom= 1.48E-16
nu= 1.11E-16 ana= 2.96E-32 lim= 2.96E-32 numer= 2.19E-48 denom= 7.40E-17
nu= 5.55E-17 ana= 7.40E-33 lim= 7.40E-33 numer= 2.74E-49 denom= 3.70E-17
nu= 2.78E-17 ana= 1.85E-33 lim= 1.85E-33 numer= 3.42E-50 denom= 1.85E-17
nu= 1.39E-17 ana= 4.62E-34 lim= 4.62E-34 numer= 4.28E-51 denom= 9.25E-18
nu= 6.94E-18 ana= 1.16E-34 lim= 1.16E-34 numer= 5.35E-52 denom= 4.63E-18
nu= 3.47E-18 ana= 2.89E-35 lim= 2.89E-35 numer= 6.68E-53 denom= 2.31E-18
nu= 1.73E-18 ana= 7.22E-36 lim= 7.22E-36 numer= 8.35E-54 denom= 1.16E-18
nu= 8.67E-19 ana= 1.81E-36 lim= 1.81E-36 numer= 1.04E-54 denom= 5.78E-19
nu= 4.34E-19 ana= 4.51E-37 lim= 4.51E-37 numer= 1.31E-55 denom= 2.89E-19
nu= 2.17E-19 ana= 1.13E-37 lim= 1.13E-37 numer= 1.63E-56 denom= 1.45E-19
nu= 1.08E-19 ana= 2.82E-38 lim= 2.82E-38 numer= 2.04E-57 denom= 7.23E-20
nu= 5.42E-20 ana= 7.05E-39 lim= 7.05E-39 numer= 2.55E-58 denom= 3.61E-20
nu= 2.71E-20 ana= 1.76E-39 lim= 1.76E-39 numer= 3.19E-59 denom= 1.81E-20
nu= 1.36E-20 ana= 4.41E-40 lim= 4.41E-40 numer= 3.98E-60 denom= 9.04E-21