我第一次使用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)
即使最接近的解决方案应该在2.8和4.7左右,它只输出'3'并说'解决方案融合' .
有没有人知道如何解决这个问题并获得正确的答案(使用fsolve)?
2 回答
我认为你的方程式没有返回猜测;它返回一个接近猜测的数字 . 它非常不稳定,似乎令人困惑
fsolve
. 例如:这不是5.在机器精度范围内甚至不是5 . 它也不是等式的根源:
但无论如何,等式的行为是不可预测的:
所以显然有's a zero crossing somewhere around there. I'd说好好看看你的等式 . 例如,确保以弧度为单位指定
tan
的参数 .您是否尝试将功能更改为非常简单的功能?像这样:
对我来说,上面的代码确实会收敛到它应该的位置 .
另外,在您提供的代码中 -
c_str
和V_0
是什么?如果实际上你的函数依赖于多个变量,并且你将所有这些变量都视为常量参数,那么请使用fsolve的args
参数,如下所示: