数值分析之上三角线性方程组求解

@数值分析之线性方程组AX=B求解

文章目录

  • 一、上三角回代求解算法
    • 1.1 上三角回代思想
        • 1.1.1何为上三角矩阵,下三角矩阵?
        • 1.1.2 回代公式
        • 1.1.3 matlab算法
  • 二、题目
    • 2.1 题目
    • 2.2 输入输出格式
    • 2.3 样例
        • 输入
        • 输出
    • 2.4 思路和要点
    • 2.5 代码
    • 2.6 结果

一、上三角回代求解算法

注意:本算法,只能求解上三角线性方程组。主要和高斯消去法(偏序选主元)、三角分解法(还要采用下三角前向替代算法)配合使用。

1.1 上三角回代思想

准备:在本章的算法中,为了求解线性方程组,我们首先将线性方程组写成AX=B的形式。(A是n×n的系数矩阵,X是n×1的未知数矩阵,B是n×1的值矩阵。)

1.1.1何为上三角矩阵,下三角矩阵?

答:简单来说,主对角线以下全0的就是上三角矩阵,主对角线以上全0的就是下三角矩阵。行列式的值为对角线元素相乘。

具体形式:

数值分析之上三角线性方程组求解_第1张图片

1.1.2 回代公式

总而言之:面对这类方程组就是由已知求未知,在第i行回代X[i+1:n],来求解X[i]。根据回代公式来计算X所有的解。下面给出回代公式证明过程。数值分析之上三角线性方程组求解_第2张图片

1.1.3 matlab算法

数值分析之上三角线性方程组求解_第3张图片

二、题目

2.1 题目

在一个上三角线性方程组基础上,进行线性方程组求解。

2.2 输入输出格式

【输入形式】在屏幕上依次输入方阵阶数n,系数矩阵A和常数矩阵B。

【输出形式】每一行输出一个根

2.3 样例

输入

4
4 -1 2 3
0 -2 7 -4
0 0 6 5
0 0 0 3
20
-7
4
6

输入说明:第1行为方阵阶数4,第2行至5行为系数矩阵A,第6行至9行为常数矩阵B。

输出

[[ 3.]
[-4.]
[-1.]
[ 2.]]

输出说明:每行依次输出方程解:x1, x2, x3, x4。

2.4 思路和要点

回代过程中,让已知的X与对应的系数相乘时,可以采用numpy中的矩阵点乘函数np.dot()。但是该函数只能让两个形状相同的相乘,而对固定形状矩阵A截取出的矩阵,形状其实没有发生变化,无法相乘,这就要使用np.reshape()函数来重新定义截取出的矩阵形状。

2.5 代码

import numpy as np
def backsub(A,B,X): #上三角回代
    n = len(X)
    X[n-1] = B[n-1]/A[n-1,n-1]
    for i in range(n-2,-1,-1):
        temp = np.reshape(A[i,i+1:],(1,len(X[i+1:]))).dot(X[i+1:])
        #截断的A虽然看似可以和X想点乘,但是程序会判断为形状不同,所以要重新赋予形状
        X[i] = (B[i]-temp)/A[i,i]
    return X

def main():
    num = int(input())
    A = np.zeros([num,num],dtype = np.double)
    B = np.zeros([num,1],dtype = np.double)
    X = np.zeros([num,1],dtype = np.double)
    for i in range(num):
        A[i,:] = np.array(input().split(),dtype = np.double)
    for i in range(num):
        B[i] = np.array(input(),dtype = np.double)
    backsub(A,B,X)
    print(X)

if __name__ == '__main__':
    main()

2.6 结果

样例:

数值分析之上三角线性方程组求解_第4张图片

你可能感兴趣的:(数值分析)