【笔记】线性方程组

目标:了解线性方程组的数值解法,掌握求解线性方程组的迭代法的有关原理方法,会用迭代法收敛的有关理论来分析迭代法的收敛性和收敛速度。

工程中许多问题最后都可以转化为求解线性方程组,而且许多数值计算问题(如样条函数、常微分方程数值解、差分方程等)的研究也往往归结为此类问题,因此线性方程组的求解是一个有广泛应用背景的问题。

线性方程组的数值法一般有如下两类:

  • 直接法——经过有限次算法求出精确解(实际上由于舍入误差只能得到近似解),最常用的方法是高斯消元法以及矩阵LU分解。
  • 迭代法——从初始值出发,用递推的方法,给出近似解序列。最常用的方法是雅克比迭代法和高斯-赛德尔迭代法。

直接法一般适用于系数矩阵A为低阶稠密矩阵(非零元素较多)的情况,而在工程技术和科学计算中常会遇到大型稀疏矩阵(非零元素较少)形式的方程组。迭代法在计算和存储两方面都适合于后一种情况。

计算实验:线性方程组求解

例1 用雅克比迭代法和高斯-赛德尔迭代法解线性方程组

image

比较两种迭代法的计算结果和收敛速度。

解:将方程组改写为

image

构造雅克比迭代格式

image

取初值image计算。

程序如下:

%雅克比迭代程序
A=[10 3 1;2 -10 3;1 3 10];
b=[14;-5;14];
D=diag(diag(A));
L=tril(A,-1);
U=triu(A,1);
J=-inv(D)*(L+U);
g=inv(D)*b;
x=[0 0 0]';
for i=1:9
    x=J*x+g;
    xx(i,:)=vpa(x,6);
end
xx

如果构造高斯-赛德尔迭代格式

image

同样取初值image计算。

程序如下:

%高斯-赛德尔迭代程序
A=[10 3 1;2 -10 3;1 3 10];
b=[14;-5;14];
D=diag(diag(A));
L=tril(A,-1);
U=triu(A,1);
G=-inv(D+L)*U;
g=inv(D+L)*b;
x=[0 0 0]';
for i=1:9
    x=G*x+g;
    xx(i,:)=vpa(x,6);
end
xx

计算结果对照表1(方程组的精确解为x=[1;1;1])。

表1 不同迭代法计算结果
k xT(雅克比迭代) xT(高斯-赛德尔迭代)

0

1
2
3
4
5
6
7
8
9

[0,0,0]

[      1.4,      0.5,      1.4]
[     1.11,      1.2,     1.11]
[    0.929,    1.055,    0.929]
[   0.9906,   0.9645,   0.9906]
[  1.01159,   0.9953,  1.01159]
[  1.00025,   1.0058,  1.00025]
[ 0.998236,  1.00013, 0.998236]
[  1.00014, 0.999118,  1.00014]
[  1.00025,  1.00007,  1.00025]

[0,0,0]

[      1.4,     0.78,    1.026]
[   1.0634,  1.02048, 0.987516]
[ 0.995104, 0.995276,  1.00191]
[  1.00123,  1.00082, 0.999632]
[ 0.999792, 0.999848,  1.00007]
[  1.00004,  1.00003, 0.999988]
[ 0.999993, 0.999995,      1.0]
[      1.0,      1.0,      1.0]
[      1.0,      1.0,      1.0]

从表中可以看出,高斯-赛德尔迭代法的收敛速度比雅克比迭代法快。除此之外从迭代格式的形式还可以看出,高斯-赛德尔迭代法需要存储的信息较少,因此占用的存储空间较少。

结果分析:

本问题中,雅克比矩阵的谱半径r(J)=0.3873<1,高斯-赛德尔迭代矩阵的谱半径r(G)=0.1831<1,且r(G)<r(J),所以两种迭代法都收敛,并且高斯-赛德尔迭代法的收敛速度快。

例2 求线性方程组的通解

image

注:在无穷多解情况下可以用三种方法求得通解:

  • rref化为行最简形式以后求解
  • 用除法求出一特解,再用null求得一个奇次组的基础解系
  • 用符号数学工具箱中的solve求解

解:在指令窗中执行

>> clear;a=[1 -1 1 -1;-1 1 1 -1;2 -2 -1 1];
>> b=[1;1;-1];
>> [rank(a),rank([a,b])]
ans =
     2     2
>> %秩相等且小于4,说明有无穷多解
>> % 方法一
>> rref([a,b])
ans =
     1    -1     0     0     0
     0     0     1    -1     1
     0     0     0     0     0
从而原方程等价于x1=x2,x3=x4+1。令x2=k1,x4=k2,求得通解为:

image

例3 (利用矩阵除法求线性方程组的特解)求方程组

image

的解。

解:

>> A=[5 6 0 0 0
1 5 6 0 0
0 1 5 6 0
0 0 1 5 6
0 0 0 1 5];
>> B=[1 0 0 0 1]';
>> % 求秩
>> R_A=rank(A)
R_A =
     5
>> % 求解
>> X=A\B
X =
    2.2662
   -1.7218
    1.0571
   -0.5940
    0.3188

这就是方程组的解。

或用函数rref求解:

>> % 由系数矩阵和常数列构成增广矩阵C
>> C=[A B];
>> % 将C化成最简形式
>> R=rref(C)
R =
    1.0000         0         0         0         0    2.2662
         0    1.0000         0         0         0   -1.7218
         0         0    1.0000         0         0    1.0571
         0         0         0    1.0000         0   -0.5940
         0         0         0         0    1.0000    0.3188

则R的最后一列元素就是所求之解。

例4 (求奇次线性方程组的通解)

在MATLAB中,函数null用来求解零空间,即满足A.X=0的解空间,实际上是求出解空间的一组基(基础解系)。

格式:

  • z=null(A)      % z的列向量为方程组的正交规范基,满足Z’xZ=I。
  • z=null(A,’r’)   % z的列向量是方程AX=0的有理基

求解方程组的通解:

image

解:

>> A=[1 2 2 1;2 1 -2 -2; 1 -1 -4 -3];
>> format rat
>> B=null(A,'r') %求解空间的有理基
B =
       2              5/3    
      -2             -4/3    
       1              0      
       0              1     

或通过行最简形得到基:

>> R=rref(A)
R =
       1              0             -2             -5/3    
       0              1              2              4/3    
       0              0              0              0     

(与上面结果一致)

写出通解:

>> syms k1 k2
>> X=k1*B(:,1)+k2*B(:,2)
 
X =
 
   2*k1 + (5*k2)/3
- 2*k1 - (4*k2)/3
                k1
                k2

例5 (求非奇次线性方程组的通解)

注:非齐次线性方程组需要先判断方程组是否有解,若有解,再去求通解。步骤如下:

  • 判断AX=b是否有解,若有解则进行第二步
  • 求AX=b得一个特解
  • 求AX=0的通解
  • AX=b的通解:AX=0的通解+AX=b的一个特解。

求解方程组

image

解: 在MATLAB中建立M文件

A=[1 -2 3 -1;3 -1 5 -3;2 1 2 -2];
b=[1 2 3]';
B=[A b];
n=4;
R_A=rank(A)
R_B=rank(B)
format rat
% 判断有唯一解
if R_A==R_B&R_A==n
    X=A\b
% 判断有无穷解
elseif R_A==R_B&R_A<n
    %求特解
    X=A\b
    % 求AX=0的基础解系
    C=null(A,'r')
% 判断无解
else X='Equation no solution'
end

运行后结果显示:


R_A =
       2      

R_B =
       3      

X =
Equation no solution

说明:该方程组无解

例6 (较完整)求解方程组的通解:

image

解:

方法一:在MATLAB中建立如下M文件

A=[1 1 -3 -1;3 -1 -3 4;1 5 -9 -8];
b=[1 4 0]';
B=[A b];
n=4;
R_A=rank(A)
R_B=rank(B)
format rat
if R_A==R_B&R_A==n
    X=a\b
elseif R_A==R_B&R_A<n
    X=A\b
    C=null(A,'r')
else X='Equation no solution'
end

运行结果为:

R_A =
       2      

R_B =
       2      
Warning: Rank deficient, rank = 2,  tol =   8.8373e-015.
> In fuluA at 11
X =
       0      
       0      
      -8/15   
       3/5    

C =
       3/2           -3/4    
       3/2            7/4    
       1              0      
       0              1     

所以原方程的通解为X=k1C[:,1]+k2C[:,2]+X

方法二:用rref求解


>> A=[1 1 -3 -1;3 -1 -3 4;1 5 -9 -8];
>> b=[1 4 0]';
>> B=[A b];
>> C=rref(B)
C =
       1              0             -3/2            3/4            5/4    
       0              1             -3/2           -7/4           -1/4    
       0              0              0              0              0    

对应齐次方程组的基础解系为:e1=[3/2 3/2 1 0]’ , e2=[-3/4 7/4 0 1]’ ;非齐次方程组的特解为:

n*=[5/4 –1/4 0 0]’ .所以原方程组的通解为:X=k1e1+k2e2+n*。

你可能感兴趣的:(笔记)