Linear least squares problem

import numpy as np


def fgauss(A, b):
    n = A.shape[0]
    zengguan = np.hstack((A, b.T))
    ra = np.linalg.matrix_rank(A)
    rz = np.linalg.matrix_rank(zengguan)
    temp1 = rz - ra
    if temp1 > 0:
        print("无一般意义下的解,系数矩阵与增广矩阵的秩不同")
        return
    if ra == rz:
        if ra == n:
            x = np.mat(np.zeros(zengguan.shape[0], dtype=float))
            for p in range(0, n):
                for k in range(p+1, n):
                    m = zengguan[k, p]/zengguan[p, p]
                    zengguan[k, p:n+1] = zengguan[k, p:n+1] - m * zengguan[p, p:n+1]
            b1 = zengguan[0:n, n]
            a1 = zengguan[0:n, 0:n]
            x[0, n-1] = b1[n-1]/a1[n-1, n-1]
            for i in range(n - 2, -1, -1):
                try:
                    x[0, i] = (b1[i] - np.sum(np.multiply(a1[i, i+1:n], x[0, i+1:n]))) / (a1[i, i])
                except:
                    print("错误")
            print(x)
    return x


if __name__ == "__main__":
    A1 = np.mat([[1,3],
                 [1,3],
                 [1,1],
                 [1,1]], dtype=float)
    b2 = np.mat([4, 3, 3, 0])
    a = A1.T*A1
    b = A1.T*b2.T
    x = fgauss(a, b.T)

Solve it x1=0.5, x2=1

Guess you like

Origin blog.csdn.net/weixin_40653652/article/details/112390612