【问题标题】:fsolve always returning the guess/estimatefsolve 总是返回猜测/估计
【发布时间】:2011-12-19 13:31:36
【问题描述】:

我第一次使用 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)?

【问题讨论】:

  • 也许你只是一个很好的猜测者。
  • 您能提供V_0c_sqr 的值吗?我试着把c_sqr = 100V_0 = 10,它正确地收敛到根2.90496355。

标签: python scipy equation-solving


【解决方案1】:

我认为你的方程式并没有像你想象的那样。一方面,当我尝试它时,它不会返回猜测;它返回一个数字 close 来猜测。它非常不稳定,这似乎让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 的参数。

【讨论】:

    【解决方案2】:

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

    #!/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_strV_0 是什么?如果实际上您的函数依赖于多个变量,并且您将除一个之外的所有变量都视为常量参数,则使用 fsolve 的 args 参数,如下所示:

    #!/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) 
    

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 2019-05-27
      • 1970-01-01
      相关资源
      最近更新 更多