@数值分析之线性方程组AX=B求解
文章目录
一、上三角回代求解算法
注意:本算法,只能求解上三角线性方程组。主要和高斯消去法(偏序选主元)、三角分解法(还要采用下三角前向替代算法)配合使用。
1.1 上三角回代思想
准备:在本章的算法中,为了求解线性方程组,我们首先将线性方程组写成AX=B的形式。(A是n×n的系数矩阵,X是n×1的未知数矩阵,B是n×1的值矩阵。)
1.1.1何为上三角矩阵,下三角矩阵?
答:简单来说,主对角线以下全0的就是上三角矩阵,主对角线以上全0的就是下三角矩阵。行列式的值为对角线元素相乘。
具体形式:
1.1.2 回代公式
总而言之:面对这类方程组就是由已知求未知,在第i行回代X[i+1:n],来求解X[i]。根据回代公式来计算X所有的解。下面给出回代公式证明过程。
1.1.3 matlab算法
二、题目
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 结果
样例: