5

我第一次使用 scipy 的 optimize.fsolve 函数来找到方程的根。问题是我用作猜测/估计值的任何数字都是我得到的答案(大约在小数点后 8 位以内)。当使用 full_output=True 时,我得到 exitflag 为“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)

它只输出“3”并表示“解决方案收敛。”,即使最接近的解决方案应该在 2.8 和 4.7 左右。

有谁知道如何解决这个问题并得到正确的答案(使用 fsolve)?

4

2 回答 2

6

我认为你的方程没有你认为的那样。一方面,当我尝试它时,它不会返回猜测;它返回一个接近猜测的数字。它非常不稳定,似乎令人困惑fsolve。例如:

>>> V_0 = 100
>>> c_sqr = 3e8 ** 2
>>> guess = 5
>>> fsolve(func, guess)
array([ 5.00000079])

这不是 5。在机器精度范围内甚至不是 5。它也不是等式的根:

>>> func(5.00000079)
2114979.3239706755

但无论如何,方程的行为是非常不可预测的:

>>> func(5.0000008)
6821403.0196130127
>>> func(5.0000006)
-96874198.203683496

所以很明显那里有一个零交叉。我会说好好看看你的方程式。例如,确保以弧度指定tan' 参数。

于 2011-12-19T13:53:59.607 回答
1

您是否尝试将您的功能更改为真正微不足道的东西?像这样:

#!/usr/bin/python
from scipy.optimize import fsolve

def func(E):
#    s = sqrt(c_sqr * (1 - E / V_0))
#    f = s / tan(s) + sqrt(c_sqr - s**2)
    f = E**2 -3.
    return f

guess = 9

sol=fsolve(func, guess)
print sol, func(sol)

对我来说,上面的代码确实收敛到它应该的位置。

此外,在您提供的代码中 ---c_str和是什么V_0?如果实际上您的函数依赖于多个变量,并且您将除一个之外的所有变量都视为常量参数,则使用argsfsolve 的参数,如下所示:

#!/usr/bin/python
from scipy.optimize import fsolve
from numpy import sqrt

def func(E,V_0):
    #s = sqrt(c_sqr * (1 - E / V_0))
    #f = s / tan(s) + sqrt(c_sqr - s**2)
    f = E**2 -V_0
    return f

VV=4.
guess = 9
sol=fsolve(func, guess, args=(VV))

print sol, func(sol,VV) 
于 2011-12-19T13:46:35.747 回答