我第一次使用scipy的optimize.fsolve函数来求一个方程的根。问题是,无论我使用哪个数字作为猜测/估计值,我得到的结果都是我的答案(大约在8位小数以内)。在使用full_output=True时,我将exitflag设置为'1',这意味着‘解决方案收敛了’,据我所知,这应该意味着输出确实是等式的根。
我知道有有限数量的不同的根(间隔开),因为当我用图形表示方程时,我可以看到它们。同样,当我输入的起始点在一个应该返回一个未定义的值(除以0,负值的平方根)的范围内时,fsolve会失败(给出错误的exitflag)。但除此之外,它总是返回起始点作为根。
我用一个非常简单的等式测试了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‘,并说'The solution converged。’,即使最接近的解应该在2.8和4.7左右。
有没有人知道如何解决这个问题并得到正确的答案(使用fsolve)?
发布于 2011-12-19 21:54:00
我认为你的方程式并不像你想的那样。首先,当我尝试它时,它不返回猜测;它返回一个接近猜测的数字。它非常不稳定,这似乎让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-19 21:46:36
你有没有试着把你的函数改成一些非常琐碎的东西?如下所示:
#!/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?如果您的函数实际上依赖于多个变量,并且您将除一个变量之外的所有变量都视为常量参数,则使用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) https://stackoverflow.com/questions/8562080
复制相似问题