假设我有一个函数,其值域为标量,但其定义域为向量。例如:
def func(x):
return x[0] + 1 + x[1]**2
如何找到这个函数的根?scipy.optimize.fsolve
和scipy.optimize.root
期望func
返回一个向量(而不是标量),并且scipy.optimize.newton
只接受标量参数。我可以重新定义func
:
def func(x):
return [x[0] + 1 + x[1]**2, 0]
然后root
和fsolve
可以找到根,但是雅可比矩阵中的零意味着它不总是能够很好地完成任务。例如:
fsolve(func, array([0,2]))
=> array([-5, 2])
这将仅改变第一个参数而不是第二个参数,意味着它经常找到一个很远的零。
编辑:看起来以下对func的重新定义效果更好:
def func(x):
fx = x[0] + 1 + x[1]**2
return [fx, fx]
fsolve(func, array([0,5]))
=>array([-16.27342781, 3.90812331])
所以现在它愿意更改这两个参数。不过代码还是有点丑。
f(x,y)=0
的解集在(x,y)
平面上是一条曲线。如果你想要唯一的解,你需要第二个函数或一个约束条件。 - Warren Weckesserscipy.optimize.fsolve
或scipy.optimize.root
这样的东西。 - lnmaurer