设计了一个测试函数,传入原矩阵和其最大秩分解,列向量。函数依次输出以下内容
- 1、判断当前给出的最大秩分解是否正确
- 2、给出的M-P广义逆
- 3、判断矩阵是否相容
- 4、若矩阵相容则输出的最小范数解和通解
- 5、若不相容则输出的最小二乘解、通解和最佳逼近解
运行环境:Python3+numpy库
import numpy as np
def same(A, B):
m = len(A)
n = len(A[0])
A = A.tolist()
B = B.tolist()
for i in range(m):
for j in range(n):
if(abs(A[i][j]-B[i][j])>0.0001):
return False;
return True
def run(A, B, D, b):
"""A为原矩阵,A=BD为其最大秩分解,Ax=b"""
A = np.mat(A)
B = np.mat(B)
D = np.mat(D)
b = np.mat(b).reshape(len(b), 1)
if(same(B*D, A)):
print("最大秩分解正确")
else:
print("最大秩分解错误")
Ap = D.T * np.linalg.inv(D*D.T) * np.linalg.inv(B.T*B) * B.T
print("M-P广义逆为:\n", Ap)
if(same(A*Ap*b, b)):
print("该方程相容")
x = Ap*b
print("最小范数解为:\n", x)
E = np.eye(len(x))
print("通解为:\n{}+{}U".format(x, E-Ap*A))
else:
print("该方程不相容")
x = Ap*b
print("最小二乘解为:\n", x)
E = np.eye(len(x))
print("最小二乘解通解为:\n{}+{}U".format(x, E-Ap*A))
print("最佳逼近解为:\n", x)
def test1():
A = [[0, 1, -1],
[-1, 0, 1],
[1, -1, 0],
[0, 1, -1]]
B = [[0, 1], [-1, 0], [1, -1], [0, 1]]
D = [[1, 0, -1], [0, 1, -1]]
b = [1, -1, 0, 1]
run(A, B, D, b)
def test2():
A = [[0, 0, 2], [1, 1, 0], [0, 0, 1], [1, 1, 1]]
B = [[0, 2], [1, 0], [0, 1], [1, 1]]
D = [[1, 1, 0], [0, 0, 1]]
b = [1, 1, 1, 1]
run(A, B, D, b)
if __name__ == '__main__':
test1()
test2()
给出的测试用例test1来自于2014年第8题。输出结果为
第二个题为书上P233 21题第一小题,运行结果为: