首页 文章

fsolve总是返回猜测/估计

提问于
浏览
5

我第一次使用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 回答

  • 1

    我认为你的方程式没有返回猜测;它返回一个接近猜测的数字 . 它非常不稳定,似乎令人困惑 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
    

    所以显然有's a zero crossing somewhere around there. I'd说好好看看你的等式 . 例如,确保以弧度为单位指定 tan 的参数 .

  • 6

    您是否尝试将功能更改为非常简单的功能?像这样:

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

相关问题