我正在尝试使用Python解决对数函数。我正在寻找一个无理数,所以我写了这个二分算法:
def racine(x):
a=0
b=x/2
c=(a+b)/2
while a!=b and a<c<b:
if c**2<x:
a=c
else:
b=c
c=(a+b)/2
return a, b
这似乎有效,至少是为了找到不合理的根源。然而,我有一个更复杂的功能:
LN(P)= A + B / T + C * LN(T)
其中P,A,B和C是已知常数。隔离T,有这样的:
Ť==ë**((LN(P)-A-B / T)/ C)
但这仍然无法解决,因为T在两边。有人能看到它的方式吗?现在我有这个代码,显然不起作用。
def temperature(P):
A=18.19
B=-23180
C=-0.8858
T==e**((log(P)-A-B/T)/C)
return racine (T)
谢谢!
答案 0 :(得分:1)
答案应该是再次使用二分法。
a=small estimate
fa = f(a)
b=large estimate
fb = f(b)
while( b-a > 1e-12 ) {
c = (a+b)/2
fc = f(c)
if( fabs(fc) < 1e-12) return c;
if( (fc>0) == (fa>0) ) {
a = c; fa = fc
} else {
b = c; f = fc;
}
return (a+b)/2
对于更有效的方法,在其Illinois变体中查找调节falsi方法。
答案 1 :(得分:0)
如果您安装了NumPy,您可以在数字上找到给定压力下的温度,例如使用scipy.optimize.newton
。例如,
import numpy as np
from scipy.optimize import newton
A, B, C = 18.19, -23180, -0.8858
fr = lambda T, lnp: (A + B/T + C*np.log(T)) - lnp
def T(p):
return newton(fr, 1000, args=(np.log(p),))
In [1]: p1 = 10
In [2]: T1 = T(p1)
In [3]: T1
Out[3]: 2597.8167133280913
In [4]: np.exp(A + B/T1 + C*np.log(T1)) # check
Out[4]: 10.000000000000002
您可能需要针对您的使用量进行自定义的初始猜测值(此处1000
):我不知道您的单位。