0

对于E=0.46732451并且t=1.07589765我正在尝试求解积分的上限 t= \int_{0}^{z} 1/sqrt(2*(0.46732451-z**2)),我绘制了这个函数,它看起来像这样z 与 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),所以我在to之间设置x0=0.5*np.sqrt(0.46732451)和设置,然后 out 弹出正确答案。我对此没有任何解释,也许这方面的专家可以提供帮助? factor0.11

4

1 回答 1

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

于 2016-03-25T22:59:58.687 回答