[英]Python: fsolve near asymptotic region
对于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
,取出这个正确的答案。 我对此没有任何解释,也许有人在这方面是专家可以提供帮助吗?
您应该改用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
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.