蟒蛇西皮解"mismatch between the input and output shape of the 'func' argument"



在我进入我的问题之前,我已经搜索了stackoverflow上具有相同问题的相关线程:

  • scipy.optimize.fsolve
  • 输入/输出错误
  • Python fsolve()抱怨形状。为什么?
  • fsolve -输入输出不匹配
  • 在二维匿名函数数组变量
  • 上使用scipy.optimize.fsolve时I/O形状不匹配

从我对这个错误的理解来看,

提高TypeError (msg)
TypeError: fsolve: 'func'参数的输入和输出形状不匹配'fsolve_function'

问题是输入和输出的形状不是相同。

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

  • 输入,initialGuess (scipy.optimize中fsolve函数中使用的起始估计)。输入initialGuess对坐标x,y和z有3个起始估计。因此,我期望我的起始输入估计总是有三个输入。
  • 输出,out(非线性联立方程)。在这个例子中,我有四个非线性方程。
  • 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)
顺便说一下,它找不到实际的0——应该有一个吗?

您也可以强制fsolve使用您的函数,如果您提供给它一个初始猜测与"伪"第四个变量:

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

但我不确定这种情况下的结果有多可靠。

相关内容

最新更新