Python scipy fsolve“’func’参数的输入和输出形状不匹配”

在讨论问题之前,我已经用相同的问题在*上搜索了相关的线程:

> input/output error in scipy.optimize.fsolve
> Python fsolve() complains about shape. Why?
> fsolve – mismatch between input and output
> I/O shape mismatch when using scipy.optimize.fsolve on 2-dimensional anonymous function array variable

据我了解到的有关此错误的信息,

raise TypeError(msg)
TypeError: fsolve: there is a mismatch between the input and output shape of the ‘func’ argument ‘fsolve_function’

问题在于输入和输出的形状不相同.

在下面的代码示例中,我具有以下内容:

>输入,initialGuess(在scipy.optimize的fsolve函数中使用的起始估算值).输入的initialGuess对坐标x,y和z具有3个初始估计.因此,我希望我的开始输入估算始终有三个输入.
>输出,输出(非线性联立方程).在此示例中,我有4个非线性方程.
> scipy.optimize.fsolve会引起上面突出显示的错误,因为输入和输出的形状不同.在我的特定情况下,我希望输入始终具有三个值(以猜测x,y和z的初始起点).在这种情况下,输出具有4个非线性方程式,可使用初始输入估算值进行求解.
>注意:使用相同的输入和输出形状,例如.输入形状3 [x,y,z]和输出3个非线性方程,fsolve会相应地进行计算.我只是想知道您如何才能扩展fsolve来使用等于或多于4个的非线性联立方程组(仅包含3个输入初始估算值)?
>以下代码:

from scipy.optimize import fsolve

def fsolve_function(arguments):
    x = arguments[0]
    y = arguments[1]
    z = arguments[2]

    out = [(35.85 - x)**2 + (93.23 - y)**2 + (-39.50 - z)**2 - 15**2]
    out.append((42.1 - x)**2 + (81.68 - y)**2 + (-14.64 - z)**2 - 27**2)
    out.append((-70.90 - x)**2 + (-55.94 - y)**2 + (-68.62 - z)**2 - 170**2)
    out.append((-118.69 - x)**2 + (-159.80 - y)**2 + (-39.29 - z)**2 - 277**2)

    return out

initialGuess = [35, 93, -39]
result = fsolve(fsolve_function, initialGuess)
print result 

解决方法:

fsolve是MINPACK hybrd的包装,它要求函数的参数和输出具有相同数量的元素.您可以尝试更通用的scipy.optimize.root中没有此限制的其他算法(例如lm):

from scipy.optimize import fsolve, root

def fsolve_function(arguments):
    x = arguments[0]
    y = arguments[1]
    z = arguments[2]

    out = [(35.85 - x)**2 + (93.23 - y)**2 + (-39.50 - z)**2 - 15**2]
    out.append((42.1 - x)**2 + (81.68 - y)**2 + (-14.64 - z)**2 - 27**2)
    out.append((-70.90 - x)**2 + (-55.94 - y)**2 + (-68.62 - z)**2 - 170**2)
    out.append((-118.69 - x)**2 + (-159.80 - y)**2 + (-39.29 - z)**2 - 277**2)

    return out

initialGuess = [35, 93, -39]
result = root(fsolve_function, initialGuess, method='lm')
print(result.x)

顺便说一句,它找不到实际的零—应该是一个零吗?

如果您提供带有“伪”第四个变量的初始猜测,也可以强制fsolve使用函数:

initialGuess = [35, 93, -39, 0]

但我不确定这种情况下的结果是否可靠.

上一篇:python3*面浏览PhantomJS的安装教程


下一篇:python-指定大于scipy中的不等式