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

Dju*_*vic 5 python scipy

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

根据我对这个错误的理解,

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

问题是输入和输出的形状一样。

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

  • 输入,initialGuessfsolve在 scipy.optimize 函数中使用的起始估计)。输入initialGuess有 3 个坐标 x、y 和 z 的起始估计值。因此,我希望我的起始输入估计始终具有三个输入。
  • 输出,out(非线性联立方程)。在这个例子中,我有 4 个非线性方程。
  • scipy.optimize.fsolve提高上述突出了错误,因为输入和输出都具有相同的形状。在我的特定情况下,我希望我的输入始终具有三个值(以猜测 x、y 和 z 的初始起点)。在这种情况下,输出有 4 个非线性方程需要使用初始输入估计来求解。
  • 旁注:使用相同的输入和输出形状,例如。3 [x, y, z] 的输入形状和 3 个非线性方程的输出,fsolve将进行相应的计算。我只是想知道您如何扩展fsolve以使用仅 3 个输入初始估计值的等于或超过 4 个非线性联立方程?
  • 代码如下:

    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 
    
    Run Code Online (Sandbox Code Playgroud)

fja*_*rri 8

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)
Run Code Online (Sandbox Code Playgroud)

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

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

initialGuess = [35, 93, -39, 0]
Run Code Online (Sandbox Code Playgroud)

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