sca*_*ity 5 python scipy equation-solving
我第一次使用scipy的optimize.fsolve函数来找到方程的根.问题是我用作猜测/估计值的数字是我得到的答案(在大约8位小数内).当使用full_output = True时,我得到退出标志为'1',这应该意味着'解决方案收敛',这是我理解的最好意味着输出确实是方程的根.
我知道有一些有限数量的不同根(间隔开来),因为当我绘制方程时,我可以看到它们.此外,当我将起始点输入到应返回未定义值(除以零,负值的平方根)的范围内时,fsolve失败(给出错误退出标志).但除此之外,它总是将起点作为根.
我用一个非常简单的方程式测试了fsolve并且工作正常,所以我知道我正在导入我需要的所有内容,并且应该正确使用fsolve.我也试过搞乱一些输入参数,但我不太了解它们,似乎没有任何改变).
下面是相关代码(E是唯一的变量,其他一切都有非零值):
def func(E):
s = sqrt(c_sqr * (1 - E / V_0))
f = s / tan(s) + sqrt(c_sqr - s**2)
return f
guess = 3
fsolve(func, guess)
Run Code Online (Sandbox Code Playgroud)
即使最接近的解决方案应该在2.8和4.7左右,它只输出'3'并说'解决方案融合'.
有没有人知道如何解决这个问题并获得正确的答案(使用fsolve)?
我认为你的等式不符合你的想法.首先,当我尝试它时,它不会返回猜测; 它返回一个接近猜测的数字.它非常不稳定,似乎令人困惑fsolve.例如:
>>> V_0 = 100
>>> c_sqr = 3e8 ** 2
>>> guess = 5
>>> fsolve(func, guess)
array([ 5.00000079])
Run Code Online (Sandbox Code Playgroud)
这不是5.在机器精度范围内甚至不是5.它也不是等式的根源:
>>> func(5.00000079)
2114979.3239706755
Run Code Online (Sandbox Code Playgroud)
但无论如何,等式的行为是不可预测的:
>>> func(5.0000008)
6821403.0196130127
>>> func(5.0000006)
-96874198.203683496
Run Code Online (Sandbox Code Playgroud)
所以很明显那里的某处有一个零交叉点.我要说好好看看你的等式.例如,确保tan以弧度为单位指定参数.