我目前正试图解x的下列方程:
3.17e-2 -从x到215的(10.^(8.64/x) / (480.1 - 10.^(4.32/x))^2)dx =0。
(很抱歉用这么粗糙的方式写了这个方程式,我不知道怎么在这里插入胶乳)
到目前为止,我已经想出了这个:
import scipy as s
from scipy.integrate import odeint,quad
import numpy as np
def f(x):
fpe = 40
k = 1.26e4*fpe**2/4.2e4
return 10.**(8.64/x) / (k - 10.**(4.32/x))**2
def intf(x):
for i in x:
if 3.17e-2 - quad(lambda i:f(i),i,215) == 0.:
print(i)
xi = np.linspace(0.01, 5, 1000)
intf(xi)但是,我仍然得到以下错误: OverflowError:(34,“结果太大”)
正如你所想象的,这不是我所期望的结果。您认为这仅仅是因为结果太大,还是代码有问题?
发布于 2021-12-20 09:28:24
您必须更改的一件事是,quad返回一个元组(y, abserr),积分的结果是quad(...)[0]
另外,如果您比较f(x) == 0,您将只检测到确切的解,这对于这个函数在浮点计算中是不可能的。您可以使用abs(f(x)) < ytol,也可以简单地使用零查找方法。我建议你使用fsolve
另一件事是,你有这个函数的导数,所以你也可以把它传递给这个函数,把你所有的函数组合在一起。
import numpy as np
from scipy.integrate import quad
from scipy.optimize import fsolve
def fprime(x):
fpe = 40
k = 1.26e4*fpe**2/4.2e4
return 10.**(8.64/x) / (k - 10.**(4.32/x))**2
def f(x):
try:
return np.array([f(i) for i in x])
except TypeError:
return 3.17e-2 - quad(lambda i:fprime(i),x,215)[0]
from scipy.optimize import fsolve
x0 = fsolve(f, 1, fprime=fprime)这给出了x0=2.03740802和f(x0) = 2.35922393e-16
https://stackoverflow.com/questions/70368130
复制相似问题