目录

        一、解释线性方程组的超定系统、欠定系统、方阵系统是什么?各种系统是否存在解?有解是否唯一或多个?

        二、求解以下线性方程组。如果方程组是方阵系统,系数矩阵为满秩,给出利用矩阵分解(如奇异值分解、QR分解、LU分解、Cholesky 分解)的数值方法求解方程组解的方法,通过代码计算方程组的解。

题目一:

       【1】 手动计算过程

       【2】代码实现

题目二:

       【1】 手写计算过程

        【2】代码实现

题目三:

    【1】手写计算过程

     【2】代码实现


        一、解释线性方程组的超定系统、欠定系统、方阵系统是什么?各种系统是否存在解?有解是否唯一或多个?

        线性方程组是由一组线性方程构成的方程组,通常可以用矩阵形式表示。在线性方程组中,有以下几种情况:

        超定系统(Overdetermined System):超定系统指方程的个数大于未知数的个数,即方程组中的方程数目多于变量数目。在超定系统中,通常不存在精确解,因为方程组中的方程数量过多,无法完全满足所有方程。因此,超定系统的解是近似解,可以通过最小二乘等方法求解。

        欠定系统(Underdetermined System):欠定系统指方程的个数小于未知数的个数,即方程组中的方程数目少于变量数目。在欠定系统中,存在无穷多个解,因为方程组中的方程不足以确定唯一的解。因此,需要引入额外的条件或约束来确定具体的解。

        方阵系统(Square System):方阵系统指方程的个数等于未知数的个数,即方程组中的方程数目与变量数目相等。在方阵系统中,存在唯一解或者无解。如果方程组中的方程是线性无关的,并且方程的个数与未知数的个数相等,则方阵系统有唯一解。如果方程组中的方程是线性相关的或者方程的个数小于未知数的个数,则方阵系统可能无解。

        总结来说,超定系统中可能无解或近似解,欠定系统中存在无穷多解,而方阵系统中可能有唯一解或无解,具体取决于方程的个数和线性相关性

        二、求解以下线性方程组。如果方程组是方阵系统,系数矩阵为满秩,给出利用矩阵分解(如奇异值分解、QR分解、LU分解、Cholesky 分解)的数值方法求解方程组解的方法,通过代码计算方程组的解。

 
题目一:

        解题方法:

       【1】 手动计算过程

        (1)计算U分解。 U为下三角矩阵

         (2)计算L矩阵

         

           然后由 LUX=B

                令Y=U*X,则方程组可以改写为两个步骤:

                L*Y=B

                U*X = Y   解得X

           【2】代码实现
#第一题
import numpy as np
import scipy.linalg
def forward_substitution(L, B):
    n = L.shape[0]
    Y = np.zeros(n)
    Y[0] = B[0] / L[0][0]
    for i in range(1, n):
        Y[i] = (B[i] - np.dot(L[i][:i], Y[:i])) / L[i][i]
    return Y
def backward_substitution(U, Y):
    n = U.shape[0]
    X = np.zeros(n)
    X[n-1] = Y[n-1] / U[n-1][n-1]
    for i in range(n-2, -1, -1):
        X[i] = (Y[i] - np.dot(U[i][i+1:], X[i+1:])) / U[i][i]
    return X
# 创建一个3x3的矩阵A和一个3维的向量B
A = np.array([[1, 2, 3], [2, -2, 1], [3, -1, -1]])
B = np.array([6, 1, 1])
# 进行LU分解
P, L, U = scipy.linalg.lu(A)
# 解方程组
Y = forward_substitution(L, P.dot(B))
X = backward_substitution(U, Y)
# 打印输出结果
print("矩阵A的LU分解结果:")
print("P =")
print(P)
print("L =")
print(L)
print("U =")
print(U)
print("方程组的解:")
print("X =")
print(X)
题目二:

        

       【1】 手写计算过程

        (1)计算U分解。 U为下三角矩阵

         (2)计算L矩阵

                

                X1=6/3=2  X2=-3/3=-1

                此时让L的第三行*U的第二列 = A32 = 2

                解得x3 = 2

                

                然后由 LUX=B

                令Y=U*X,则方程组可以改写为两个步骤:

                L*Y=B

                U*X = Y   解得X

        【2】代码实现
#第二题
import numpy as np
import scipy.linalg

def forward_substitution(L, B):
 n = L.shape[0]
    Y = np.zeros(n)
    Y[0] = B[0] / L[0][0]
    for i in range(1, n):
        Y[i] = (B[i] - np.dot(L[i][:i], Y[:i])) / L[i][i]
    return Y

def backward_substitution(U, Y):
    n = U.shape[0]
    X = np.zeros(n)
    X[n-1] = Y[n-1] / U[n-1][n-1]
    for i in range(n-2, -1, -1):
        X[i] = (Y[i] - np.dot(U[i][i+1:], X[i+1:])) / U[i][i]
    return X

# 创建一个3x3的矩阵A和一个3维的向量B
A = np.array([[3, 2, -1], [6, 6, -2], [-3, 2, 0]])
B = np.array([0, -2, -5])

# 进行LU分解
P, L, U = scipy.linalg.lu(A)

# 解方程组
Y = forward_substitution(L, P.dot(B))
X = backward_substitution(U, Y)

# 打印输出结果
print("矩阵A的LU分解结果:")
print("P =")
print(P)
print("L =")
print(L)
print("U =")
print(U)
print("方程组的解:")
print("X =")
print(X)
题目三:
 
    【1】手写计算过程

        (1)计算U分解。 U为下三角矩阵:

        

 (2)计算L矩阵

        X1=1/1=1  X2=2/1=2

        此时让L的第三行*U的第二列 = A32 = 4

        解得x3 = 7/6  

        然后由

                LUX=B

                令Y=U*X,则方程组可以改写为两个步骤:

                L*Y=B

                U*X = Y   解得X

        【2】代码实现
#第三题
import numpy as np
import scipy.linalg

def forward_substitution(L, B):
    n = L.shape[0]
    Y = np.zeros(n)
    Y[0] = B[0] / L[0][0]
    for i in range(1, n):
        Y[i] = (B[i] - np.dot(L[i][:i], Y[:i])) / L[i][i]
    return Y

def backward_substitution(U, Y):
    n = U.shape[0]
    X = np.zeros(n)
    X[n-1] = Y[n-1] / U[n-1][n-1]
    for i in range(n-2, -1, -1):
        X[i] = (Y[i] - np.dot(U[i][i+1:], X[i+1:])) / U[i][i]
    return X

# 创建一个3x3的矩阵A和一个3维的向量B
A = np.array([[3, 2, -1], [1, -3, 2], [2, 4, -3]])
B = np.array([5, 6, 7])

# 进行LU分解
P, L, U = scipy.linalg.lu(A)

# 解方程组
Y = forward_substitution(L, P.dot(B))
X = backward_substitution(U, Y)

# 打印输出结果
print("矩阵A的LU分解结果:")
print("P =")
print(P)
print("L =")
print(L)
print("U =")
print(U)
print("方程组的解:")
print("X =")
print(X)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐