对于E=0.46732451
和t=1.07589765
我试图求解积分的上限t = \ int_ {0} ^ {z} 1 / sqrt(2 *(0.46732451-z **) 2)),我绘制了这个函数,它看起来像。
大约t=1
它的渐近线。
我有以下代码
import numpy as np
from scipy import integrate
from scipy.optimize import fsolve
def fg(z_up,t,E):
def h(z,E):
return 1/(np.sqrt(2*(E-z**2)))
b, err = integrate.quad(h, 0, z_up,args=(E))
return b-t
x0 = 0.1
print fsolve(fg, x0, args=(1.07589765, 0.46732451))[0]
但是这个代码只输出猜测值,无论我放什么,所以我猜它与曲线渐近原因有关。我应该注意,此代码适用于远离渐近区域的t
的其他值。
任何人都可以帮我解决这个问题吗?
谢谢
编辑经过一段时间的游戏后,我解决了这个问题,但这是一种拼凑而成,只适用于一般情况下的类似问题(或者是吗?)
我做了以下更改:z
可以获得的最大值为sqrt(0.46732451)
,因此我设置x0=0.5*np.sqrt(0.46732451)
并将factor
设置为0.1
之间的任意值1
,然后弹出正确的答案。我对此没有解释,也许某人是这方面的专家可以提供帮助吗?
答案 0 :(得分:1)
您应该使用bisect
,因为它可以毫无问题地处理nan
:
print bisect(fg, 0.4, 0.7, args=(1.07589765, 0.46732451))
这里以0.4和0.7为例,但你可以使用0
对几乎所有的分歧积分进行推广,然后让1e12
作为限制。
然而,我不确定我明白你真正想要做什么...如果你想找到积分发散的极限,参见您的
我正在尝试解决积分的上限
那么它只是z_up -> \sqrt{E} \approx 0,683611374
...
因此,要找到积分的(近似)数值,您只需从该值减去z_up
,直到quad
停止给出nan
...