为什么不能在一个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)
我可以使用什么呢?
答案 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