我有一组n个形式的方程式:
其中c_i是浮点常数。我想解决这个方程组。
该系统可以简化为Ax = [O]的矩阵形式,其中解x是矩阵的零空间。
以下是从给定的c_i生成矩阵的过程。
n = len(c)
m = []
for i in xrange(n):
coef = []
for j in xrange (n):
if i == j :
coef.append(c[i]-1)
else :
coef.append(c[i])
m.append(coef)
A = matrix(m)
对于存在的非平凡解,我们需要这个矩阵的行列式是非零的,而事实并非如此。
使行列式为零的一种方法是使矩阵的最后一行为零。通过这样做,除了最后一行之外,我们正确地得到所有x_i。以下是相同的代码:
import scipy
from scipy import linalg, matrix
def null(A, eps=1e-15):
u, s, vh = scipy.linalg.svd(A)
null_mask = (s <= eps)
null_space = scipy.compress(null_mask, vh, axis=0)
return scipy.transpose(null_space)
def solve_for_values(c):
n = len(c)
m = []
for i in xrange(n-1):
coef = []
for j in xrange (n):
if i == j :
coef.append(c[i]-1)
else :
coef.append(c[i])
m.append(coef)
z = [0 for _ in xrange(n)]
m.append(z)
A = matrix(m)
return null(A)
# Testing
if __name__ == "__main__" :
c_array = [0.037105,0.548525,0.102255,0.008687,0.203427]
x = solve_for_values(c_array)
print x
for item in x :
print item/sum(x)
输出
[0.037105,0.548525,0.102255,0.008687,0.303428]
请注意,前四个值与代码中的c_array
匹配,但最后一个除外。
这是我们能做的最好的吗?我也愿意接近解决方案。