Python: fsolve 接近渐近区域

Python: fsolve near asymptotic region

对于 E=0.46732451t=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在[=20=之间的任意位置] 到 1,然后弹出正确答案。我对此没有解释,也许这方面的专家可以提供帮助?

您应该改用 bisect,因为它可以毫无问题地处理 nan

print bisect(fg, 0.4, 0.7, args=(1.07589765, 0.46732451))

这里以 0.4 和 0.7 为例,但您可以通过使用 0 将其概括为几乎任何发散积分,假设 1e12 作为极限。

但是,我不确定我是否理解您真正想要做的...如果您想找到积分发散的极限,请参见。你的

I am trying to solve for the upper limit of the integral

那么就是为了z_up -> \sqrt{E} \approx 0,683611374... 因此,要找到积分的(近似)数值,您只需从该值减少 z_up 直到 quad 停止给出 nan...