在我遇到问题之前,我已经在stackoverflow上搜索了相同的线程并遇到了同样的问题:
据我所知,读到这个错误,
引发TypeError(msg)
TypeError:fsolve:' func'的输入和输出形状之间存在不匹配。论证' fsolve_function'
问题是输入和输出的形状不相同。
在下面的代码示例中,我有以下内容:
initialGuess
(在scipy.optimize中fsolve
函数中使用的起始估计值)。输入initialGuess
有3个坐标x,y和z的起始估计值。因此,我希望我的开始输入估计总是有三个输入。out
(非线性联立方程)。在这个例子中,我有4个非线性方程。scipy.optimize.fsolve
会引发上面突出显示的错误,因为不的输入和输出具有相同的形状。在我的特定情况下,我希望我的输入总是有三个值(猜测x,y和z的初始起点)。在这种情况下,输出有4个非线性方程式,可以使用初始输入估算来解决。fsolve
将相应地进行计算。我只是想知道你怎么能延长fsolve
使用let等于或超过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
答案 0 :(得分:4)
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]
但我不确定这种情况下的结果有多可靠。