python – 使用带有约束的linalg求解系统
作者:互联网
我想用linalg以矩阵的形式解决一些系统,但是得到的解决方案总和应该为1.例如,假设有3个未知数,x,y,z.解决系统后,它们的值应总计为1,如.3,.5,.2.谁能告诉我怎么做到这一点?
目前,我正在使用类似result = linalg.solve(A,B)的东西,其中A和B是矩阵.但是这不会返回[0,1]范围内的解决方案.
解决方法:
linalg.solve
is used to compute the “exact” solution,x
, of the
well-determined, i.e., full rank, linear matrix equationax = b
.
存在
线性,最多可以有一个解决方案.如果您找到的解决方案没有
总计为1,然后添加额外的约束将不会产生任何解决方案.
但是,你可以使用scipy.optimize.minimize
找到约束平面上最小化数量的点
||斧-B || ^ 2:
def f(x):
y = np.dot(A, x) - b
return np.dot(y, y)
cons = ({'type': 'eq', 'fun': lambda x: x.sum() - 1})
res = optimize.minimize(f, [0, 0, 0], method='SLSQP', constraints=cons,
options={'disp': False})
例如,给定这个方程组
import numpy as np
import numpy.linalg as LA
import scipy.optimize as optimize
A = np.array([[1, 3, 4], [5, 6, 9], [1, 2, 3]])
b = np.array([1, 2, 1])
x = LA.solve(A, b)
该解决方案不等于1:
print(x)
# [-0.5 -1.5 1.5]
但你可以尝试最小化f:
def f(x):
y = np.dot(A, x) - b
return np.dot(y, y)
受限于约束:
cons = ({'type': 'eq', 'fun': lambda x: x.sum() - 1})
res = optimize.minimize(f, [0, 0, 0], method='SLSQP', constraints=cons,
options={'disp': False})
xbest = res['x']
# array([ 0.30000717, 1.89998823, -1.1999954 ])
xbest总和为1:
print(xbest.sum())
1
差异A·xbest – b是:
print(np.dot(A, xbest) - b)
# [ 0.19999026 0.10000663 -0.50000257]
和差的平方和(也可以计算为f(xbest))是:
print(res['fun'])
0.30000000014542572
在满足约束条件时,x的其他值不会使该数量最小化.
标签:python,matrix,numpy,equation-solving 来源: https://codeday.me/bug/20190612/1222300.html