快速验证矩阵求MP广义逆及最小范数解或最小二乘解是否正确

\quad设计了一个测试函数,传入原矩阵AA和其最大秩分解B,D,A=BDB,D,A=BD,列向量bb。函数依次输出以下内容

  • 1、判断当前给出的最大秩分解是否正确
  • 2、给出AA的M-P广义逆A+A^+
  • 3、判断矩阵是否相容
  • 4、若矩阵相容则输出Ax=bAx=b的最小范数解和通解
  • 5、若不相容则输出Ax=bAx=b的最小二乘解、通解和最佳逼近解

\quad运行环境: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()

\quad给出的测试用例test1来自于2014年第8题。输出结果为
在这里插入图片描述
\quad第二个题为书上P233 21题第一小题,运行结果为:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章