pythonscipyfsolve“;';func';“论点”;

pythonscipyfsolve“;';func';“论点”;,python,scipy,Python,Scipy,在讨论我的问题之前,我已经搜索了stackoverflow上具有相同问题的相关线程: 根据我对这个错误的理解 raise TypeError(msg) TypeError:fsolve:“func”参数“fsolve\u function”的输入和输出形状不匹配 问题是输入和输出的形状不一样 在下面的代码示例中,我有以下内容: 输入,initialGuess(要在scipy.optimize中的fsolve函数中使用的起始估计值)。输入,initialGuess有3个坐标x、y和z

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

根据我对这个错误的理解

raise TypeError(msg)
TypeError:fsolve:“func”参数“fsolve\u function”的输入和输出形状不匹配

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

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

  • 输入,
    initialGuess
    (要在scipy.optimize中的
    fsolve
    函数中使用的起始估计值)。输入,
    initialGuess
    有3个坐标x、y和z的起始估计值。因此,我希望我的初始投入估算总是有三个投入
  • 输出,
    out
    (非线性联立方程)。在这个例子中,我有4个非线性方程
  • scipy.optimize.fsolve
    引发上面突出显示的错误,因为输入和输出的形状不同。在我的特殊情况下,我希望我的输入总是有三个值(猜测x、y和z的初始起点)。这种情况下的输出有4个非线性方程需要使用初始输入估计来求解
  • 旁注:使用相同的输入和输出形状,例如3[x,y,z]的输入形状和3个非线性方程的输出,
    fsolve
    将相应地进行计算。我只是想知道如何扩展
    fsolve
    来使用4个或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的包装,它要求函数的参数和输出具有相同数量的元素。您可以尝试其他不受此限制的通用算法(例如,
lm
):

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

如果使用“伪”第四个变量对函数进行初始猜测,也可以强制
fsolve
使用函数:

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

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

谢谢您的回复。我希望解决方案的答案会有一些错误,但在可接受的阈值内。默认情况下,
root
使用
method='hybr'
,因此引发与
fsolve
相同的错误。但它允许您指定其他不这样做的方法(如我所示)。至于错误-你确定有根吗?也许您需要寻找一个最小值(使用适当的函数)?行
result=root(fsolve\u函数,initialGuess,method='lm')
起作用。我需要添加一个特定的方法,即
lm
。再次感谢,我想这解决了我的问题。
initialGuess = [35, 93, -39, 0]