pythonscipyfsolve“;';func';“论点”;
在讨论我的问题之前,我已经搜索了stackoverflow上具有相同问题的相关线程: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
TypeError:fsolve:“func”参数“fsolve\u function”的输入和输出形状不匹配 问题是输入和输出的形状不一样 在下面的代码示例中,我有以下内容:
- 输入,
(要在scipy.optimize中的initialGuess
函数中使用的起始估计值)。输入,fsolve
有3个坐标x、y和z的起始估计值。因此,我希望我的初始投入估算总是有三个投入initialGuess
- 输出,
(非线性联立方程)。在这个例子中,我有4个非线性方程out
引发上面突出显示的错误,因为输入和输出的形状不同。在我的特殊情况下,我希望我的输入总是有三个值(猜测x、y和z的初始起点)。这种情况下的输出有4个非线性方程需要使用初始输入估计来求解scipy.optimize.fsolve
- 旁注:使用相同的输入和输出形状,例如3[x,y,z]的输入形状和3个非线性方程的输出,
将相应地进行计算。我只是想知道如何扩展fsolve
来使用4个或4个以上的非线性联立方程组,其中只有3个输入初始估计fsolve
- 代码如下:
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]