首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fsolve总是返回猜测/估计

fsolve总是返回猜测/估计
EN

Stack Overflow用户
提问于 2011-12-19 21:31:36
回答 2查看 4.1K关注 0票数 5

我第一次使用scipy的optimize.fsolve函数来求一个方程的根。问题是,无论我使用哪个数字作为猜测/估计值,我得到的结果都是我的答案(大约在8位小数以内)。在使用full_output=True时,我将exitflag设置为'1',这意味着‘解决方案收敛了’,据我所知,这应该意味着输出确实是等式的根。

我知道有有限数量的不同的根(间隔开),因为当我用图形表示方程时,我可以看到它们。同样,当我输入的起始点在一个应该返回一个未定义的值(除以0,负值的平方根)的范围内时,fsolve会失败(给出错误的exitflag)。但除此之外,它总是返回起始点作为根。

我用一个非常简单的等式测试了fsolve,它工作得很好,所以我知道我正在导入我需要的一切,并且应该正确地使用fsolve。我还试着修改一些输入参数,但我不是很好地理解它们,似乎什么都没有改变)。

下面是相关代码(E是唯一的变量,其他所有变量都有一个非零值):

代码语言:javascript
复制
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‘,并说'The solution converged。’,即使最接近的解应该在2.8和4.7左右。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-19 21:54:00

我认为你的方程式并不像你想的那样。首先,当我尝试它时,它不返回猜测;它返回一个接近猜测的数字。它非常不稳定,这似乎让fsolve感到困惑。例如:

代码语言:javascript
复制
>>> V_0 = 100
>>> c_sqr = 3e8 ** 2
>>> guess = 5
>>> fsolve(func, guess)
array([ 5.00000079])

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

代码语言:javascript
复制
>>> func(5.00000079)
2114979.3239706755

但方程的行为无论如何都是相当不可预测的:

代码语言:javascript
复制
>>> func(5.0000008)
6821403.0196130127
>>> func(5.0000006)
-96874198.203683496

所以很明显这附近有个零交叉点。我要说的是好好看看你的等式。例如,请确保以弧度指定tan的参数。

票数 6
EN

Stack Overflow用户

发布于 2011-12-19 21:46:36

你有没有试着把你的函数改成一些非常琐碎的东西?如下所示:

代码语言:javascript
复制
#!/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参数,如下所示:

代码语言:javascript
复制
#!/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) 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8562080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档