Python:fsolve在渐近区

时间:2016-03-25 02:49:44

标签: python scipy quad

对于E=0.46732451t=1.07589765我试图求解积分的上限t = \ int_ {0} ^ {z} 1 / sqrt(2 *(0.46732451-z **) 2)),我绘制了这个函数,它看起来像z vs t

大约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,然后弹出正确的答案。我对此没有解释,也许某人是这方面的专家可以提供帮助吗?

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 ...