求解scipy中的非线性方程组,为什么它说“输入和输出形状之间不匹配”

时间:2014-08-13 04:26:53

标签: python numpy scipy mathematical-optimization

我想解决一个非线性方程组(我有17个变量和17个方程)。我使用了scipy.optimize.fsolve,但错误信息显示" fsolve:' func'的输入和输出形状之间存在不匹配。争论' 。",有谁知道为什么?我在这里附上我的代码(它可能看起来很复杂,但实际上只是一个非线性方程组)非常感谢!!!!

import scipy
import scipy.optimize
f = lambda x: [0.5*x[4]*x[6]*(x[16]**2-x[15]**2)-x[0],\
            0.5*x[4]*x[7]*(x[16]**2-x[15]**2)-x[1],\
            0.5*x[4]*x[9]*(1-x[16]**2)-x[2],\
            0.5*x[4]*x[8]*(x[16]**2-x[15]**2)+0.5*x[4]*x[10]*(1-x[16]**2)+x[5]-x[3],\
            (2*x[6]*(x[16]**2-x[15]**2))/((x[6]**2+x[7]**2)*(x[16]**2-x[15]**2)**2+x[9]**2*(1-x[16]**2)**2)-x[4],\
            1-0.5*x[4]*((x[6]+x[8])*(x[16]**2-x[15]**2)+x[10]*(1-x[16]**2))-x[5],\
            (1-x[0])/(x[0]*x[2]**2)-x[6],\
            -x[1]/(x[0]*x[2]**2)-x[7],\
            -x[3]/(x[0]*x[2]**2)-x[8],\
            -x[2]/(x[0]*((1-x[0])**2+x[1]**2))-x[9],\
            ((1-x[0])-x[3])/(x[0]*((1-x[0])**2+x[1]**2))-x[10],\
            (1-x[0])*(2*x[6]+x[8])-x[1]*x[7]-x[3]*x[6]-x[3]*x[8]-x[11],\
            x[10]*(1-x[0])-x[2]*x[9]-x[3]*x[10]-x[12],\
            x[6]**2*(3*(1-x[0])**2+2*x[1]**2+2*x[2]**2+x[3]**2)+x[7]**2*(2*(1-x[0])**2+x[1]**2+x[2]**2)+x[8]**2*((1-x[0])**2+x[1]**2+x[2]**2)-x[13],\
            x[9]**2*(2*(1-x[0])**2+x[1]**2+x[2]**2+x[3]**2)+x[10]**2*((1-x[0])**2+x[1]**2+x[2]**2)-x[14],\
            (x[12]-0.5*x[0]*x[14])*x[15]-0.5*x[0]/x[15]*(2*x[0]**2+x[1]**2+x[2]**2+x[3]**2-2)-0.1+x[2]]

x0 = scipy.optimize.fsolve(f,[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7],)
print x0

1 个答案:

答案 0 :(得分:0)

您的目标函数包含16个元素,而不是您建议的17个元素。因此,简单地向f()提供另一个元素将解决问题,例如:

f = lambda x: [..., ..., ..., sum(x)]

x0 = scipy.optimize.fsolve(f,[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7],)
print x0
[  5.00037636e-01   1.69907838e-12   4.99999999e-01   4.99962364e-01
   9.63171784e-05   1.00000000e+00   3.99939790e+00   7.19258762e-12
  -3.99939790e+00  -4.00030112e+00   7.16678138e-15   1.99954843e+00
   2.00015055e+00   3.19873572e+01   1.60006023e+01   4.67385102e-01
  -5.09548388e+01]