Scipy Root查找非方矩阵

时间:2014-12-25 20:28:10

标签: python numpy scipy

为什么不能在一个scipy优化函数中插入非方矩阵? (我的意思是函数F的行多于变量)

def F(x):
    L = numpy.zeros(13)
    L[0] = x[0]*x[0] - x[0]
    L[1] = x[1]*x[1] - x[1]
    L[2] = x[2]*x[2] - x[2]
    L[3] = x[3]*x[3] - x[3]
    L[4] = x[4]*x[4] - x[4]
    L[5] = x[5]*x[5] - x[5]
    L[6] = x[6]*x[6] - x[6]
    L[7] = x[7]*x[7] - x[7]

    L[8] = x[0]+x[1]+x[2]-2
    L[9] = x[5]+x[6]-x[7]-2
    L[10] = 3*x[0]+x[1]+x[2]-1
    L[11] = x[0]+x[4]+x[3]-2
    L[12] = x[3]-2*x[5]+x[7]-2
    return L

x = [1,1,1,1,1,1,1,1]


print x
print F(x)
y = scipy.optimize.root(F, x)

我可以使用什么呢?

1 个答案:

答案 0 :(得分:0)

看来optimize.root要求F取一个形状数组(N,)并返回 形状(N,)的数组。

一个例外是使用method='lm'时。 The docs say

  

方法lm以最小二乘意义求解非线性方程组   使用Levenberg-Marquardt算法的修改   MINPACK [R110]。

运行

sol = optimize.root(F, x, method='lm')
print(sol.x)
print(sol.fun))

产量

[-0.25534031  1.00426132  1.00426132  1.26246697  0.99641747 -0.1852661
  1.32671248 -0.14183467]
[ 0.32053899  0.00427948  0.00427948  0.33135589 -0.00356969  0.21958963
  0.43345353  0.16195174 -0.24681766 -0.71671895  0.24250171  0.00354414
 -0.50883549]

所以虽然是一个"解决方案"被发现,它不是F的根。 这是为什么?使用method='lm'optimize.root正在返回 最小化 |F|^2的解决方案。它与您使用optimize.minimize找到的位置相同:

def Fnorm(x):
    return (F(x)**2).sum()

res = optimize.minimize(Fnorm, x)

print(res['x'])
# array([-0.25534014,  1.00426118,  1.00426118,  1.26246497,  0.99641833,
#        -0.1852652 ,  1.32672144, -0.14182902])

print(res['fun'])
# 1.3672594815275587