今天我们要说的就是数值微积分,赶紧看看他和高等数学中的微积分有什么区别吧。本文是科学计算与MATLAB语言专题六第2小节的学习笔记,如果大家有时间的话,可以去听听课,没有的话,可以看看我的笔记,还是很不错的。
1.线性方程组的直接解法
高斯(Gauss)消去法
列主元消去法
矩阵的三角分解法
高斯(Gauss)消去法是一个经典的直接法,由它改进得到的列主元消去法,是目前计算机上求解线性方程组的标准算法,其特点就是通过消元将一般线性方程组的求解问题转化为三角方程组的求解问题。此外,还有矩阵的三角分解法等许多直接求解算法。
(1)利用左除运算符的直接解法
MATLAB提供了一个左除运算符“\”用于求解线性方程组,它使用列主元消去法,使用起来十分方便。对于线性方程组 A x = b Ax=b Ax=b,可以利用左除运算符反斜杠求解,b左除以A可获得线性方程组的数值解x。
A x = b Ax=b Ax=b→ x = A \ b x=A\backslash b x=A\b
注意,如果矩阵A是奇异的或接近奇异的,则MATLAB会给出警告信息。
例1 用左除运算符求解下列线性方程组。
{ 2 x 1 + x 2 − 5 x 3 + x 4 = 13 x 1 − 5 x 2 + 7 x 4 = − 9 2 x 2 + x 3 − x 4 = 6 x 1 + 6 x 2 − x 3 − 4 x 4 = 0 \left\{ \begin{aligned} 2x_1+x_2-5x_3+x_4=13\\ x_1-5x_2+7x_4=-9\\ 2x_2+x_3-x_4=6\\ x_1+6x_2-x_3-4x_4=0 \end{aligned} \right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧2x1+x2−5x3+x4=13x1−5x2+7x4=−92x2+x3−x4=6x1+6x2−x3−4x4=0
A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
b=[13,-9,6,0]';
x=A\b
(2)利用矩阵分解求解线性方程组矩阵分解是设计算法的重要技巧,是指将一个给定的矩阵分解成若干个特殊类型矩阵的乘积,从而将一个一般的矩阵计算问题转化为几个易求的特殊矩阵的计算问题。通过矩阵分解方法求解线性方程组的优点是运算速度快,可以节省存储空间。
LU分解
QR分解
Cholesky分解
①LU分解的基本思想
矩阵的LU分解就是将一个n阶矩阵表示为一个下三角矩阵和一个上三角矩阵的乘积。线性代数中已经证明,只要方阵是非奇异的,LU分解总是可以进行的。
A = L U → A x = b → L U x = b A=LU →Ax=b→LUx=b A=LU→Ax=b→LUx=b→ { L y = b U x = y \left\{ \begin{aligned}Ly=b\\Ux=y \end{aligned} \right. {Ly=bUx=y
对于三角方程很容易求解,于是可以首解向量y使Ly=b,再求解Ux=y,从而达到求解线性方程组Ax=b的目的。
②MATLAB的LU分解函数
LU分解函数是根据列主元LU分解算法定义的,具有较好的数据稳定性。lu函数有两种调用格式:
[L,U]=lu(A):
产生一个上三角阵U和一个变换形式的下三角阵L,使之满足A=LU。注意,这里的矩阵A必须是方阵。
[L,U,P]=lu(A):
产生一个上三角阵U和一个下三角阵L以及一个置换矩阵P,使之满足PA=LU。同样,矩阵A必须是方阵。
当使用第一种格式时,矩阵L往往不是一个下三角阵,但可以通过行交换成为一个下三角阵。
③用LU分解求解线性方程组
A x = b Ax=b Ax=b→ L U x = b LUx=b LUx=b→ x = U \ ( L \ b ) x=U \backslash (L\backslash b) x=U\(L\b)
或
A x = b Ax=b Ax=b→ P A x = P b PAx=Pb PAx=Pb→ L U x = P b LUx=Pb LUx=Pb→ x = U \ ( L ∗ b ) x=U \backslash(L*b) x=U\(L∗b)
通过LU分解后可以大大提高运算速度。
例2 用LU分解求解例1中的线性方程组。
A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
b=[13,-9,6,0]';
[L,U]=lu(A);
x=U\(L\b)
x =
-66.5556
25.6667
-18.7778
26.5556
2.线性方程组的迭代解法
迭代法是一种不断用变量的原值推出它的新值的过程,是用计算机解决问题的一种基本方法。
{ 10 x 1 − x 2 = 9 − x 1 + 10 x 2 − 2 x 3 = 7 − 2 x 2 + 10 x 3 = 6 \left\{ \begin{aligned} 10x_1-x_2=9\\ -x_1+10x_2-2x_3=7\\ -2x_2+10x_3=6 \end{aligned} \right. ⎩⎪⎨⎪⎧10x1−x2=9−x1+10x2−2x3=7−2x2+10x3=6 ⟹ \implies ⟹ { x 2 = 10 x 1 − 9 x 1 = 10 x 2 − 2 x 3 − 7 x 3 = ( 6 + 2 x 2 ) 10 \left\{ \begin{aligned} x_2&=10x_1-9\\ x_1&=10x_2-2x_3-7\\ x_3&=(6+2x_2)10 \end{aligned} \right. ⎩⎪⎨⎪⎧x2x1x3=10x1−9=10x2−2x3−7=(6+2x2)10 ⟹ \implies ⟹ { x 1 k + 1 = 10 x 2 k − 2 x 3 k − 7 x 2 k + 1 = 10 x 1 k − 9 x 3 k + 1 = 0.6 + 0.2 x 2 k \left\{ \begin{aligned} x_1^{k+1}&=10x_2^{k}-2x_3^{k}-7\\ x_2^{k+1}&=10x_1^{k}-9\\ x_3^{k+1}&=0.6+0.2x_2^{k} \end{aligned} \right. ⎩⎪⎪⎨⎪⎪⎧x1k+1x2k+1x3k+1=10x2k−2x3k−7=10x1k−9=0.6+0.2x2k
(1)雅可比(Jacobi)迭代法
A x = b , A = D − L − U , ( D − L − U ) x = b Ax=b, A=D-L-U, (D-L-U)x=b Ax=b,A=D−L−U,(D−L−U)x=b
D = [ a 11 a 22 ⋱ a n n ] D=\left [ \begin{array}{cccc} a_{11} & & & \\ & a_{22} & & \\ & & \ddots & \\ & & & a_{nn} \end{array} \right] D=⎣⎢⎢⎡a11a22⋱ann⎦⎥⎥⎤
L = − [ 0 a 21 0 a 31 a 32 0 ⋮ ⋮ ⋮ ⋱ a n 1 a n 2 ⋯ ⋯ 0 ] L=-\left [ \begin{array}{cccc} 0 & && & \\ a_{21} & 0 && & \\ a_{31} & a_{32} &0& & \\ \vdots &\vdots&\vdots &\ddots&\\ a_{n1} & a_{n2}&\cdots& \cdots&0 \end{array} \right] L=−⎣⎢⎢⎢⎢⎢⎡0a21a31⋮an10a32⋮an20⋮⋯⋱⋯0⎦⎥⎥⎥⎥⎥⎤
U = − [ 0 a 12 a 13 ⋯ a 1 n 0 a 23 ⋯ a 2 n ⋱ ⋱ ⋮ ⋱ a n − 1 n 0 ] U=-\left [ \begin{array}{cccc} 0 & a_{12} &a_{13}& \cdots & a_{1n} \\ & 0 &a_{23}& \cdots &a_{2n} \\ & &\ddots& \ddots & \vdots \\ & & &\ddots&a_{n-1n}\\ &&& &0 \end{array} \right] U=−⎣⎢⎢⎢⎢⎢⎡0a120a13a23⋱⋯⋯⋱⋱a1na2n⋮an−1n0⎦⎥⎥⎥⎥⎥⎤
求解公式为:
x = D − 1 ( L + U ) x + D − 1 b x=D^{-1}(L+U)x+D^{-1}b x=D−1(L+U)x+D−1b
与之对应的迭代公式为:
x k + 1 = D − 1 ( L + U ) x k + D − 1 b x^{k+1}=D^{-1}(L+U)x^{k}+D^{-1}b xk+1=D−1(L+U)xk+D−1b ⟹ ( B = D − 1 ( L + U ) , f = D − 1 b \implies(B=D^{-1}(L+U),f=D^{-1}b ⟹(B=D−1(L+U),f=D−1b) ⟹ x k + 1 = B x k + f \implies x^{k+1}=Bx^{k}+f ⟹xk+1=Bxk+f
雅可比迭代法的函数文件jacobi.m:
function [y,n]=jacobi(A,b,x0,ep)
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B=D\(L+U);
f=D\b;
y=B*x0+f;
n=1;
while norm(y-x0)>=ep
x0=y;
y=B*x0+f;
n=n+1;
end
(2)高斯-赛德尔(Gauss-Serdel)迭代法
D x k + 1 = ( L + U ) x k + b → D x k + 1 = L x k + 1 + U x k + b → ( D − L ) x k + 1 = U x k + b x k + 1 = ( D − L ) − 1 U × 0 + ( U − L ) − 1 b → B = D − L − 1 U , f = D − L − 1 b → x k + 1 = B x k + f Dx^{k+1}=(L+U)x^{k}+b →Dx^{k+1}=Lx^{k+1}+Ux^k+b→ (D-L)x^{k+1}=Ux^{k}+b \\ x^{k+1}=(D-L)^{-1}U×0+(U-L)^{-1}b →B=D-L^{-1}U,f=D-L^{-1}b→ x^{k+1}=Bx^{k}+f Dxk+1=(L+U)xk+b→Dxk+1=Lxk+1+Uxk+b→(D−L)xk+1=Uxk+bxk+1=(D−L)−1U×0+(U−L)−1b→B=D−L−1U,f=D−L−1b→xk+1=Bxk+f
Gauss-Serdel迭代法的函数文件gauseidel.m
function [y,n]=gauseidel(A,b,x0,ep)
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B=(D-L)\U;
f=(D-L)\b;
y=B*x0+f;
n=1;
while norm(y-x0)>=ep
x0=y;
y=B*x0+f;
n=n+1;
end
例3 分别用雅可比迭代法和高斯-赛德尔迭代法求解线性方程组。设迭代初值为0,迭代精度为10^(-6)。
[ 4 − 2 − 1 − 2 4 3 − 1 − 3 3 ] \left[\begin{matrix} 4&-2&-1\\ -2&4&3\\ -1&-3&3 \end{matrix}\right] ⎣⎡4−2−1−24−3−133⎦⎤ [ x 1 x 2 x 3 ] \left[\begin{matrix} x_1\\ x_2\\ x_3 \end{matrix}\right] ⎣⎡x1x2x3⎦⎤= [ 1 5 0 ] \left[\begin{matrix} 1\\ 5\\ 0 \end{matrix}\right] ⎣⎡150⎦⎤
A=[4,-2,-1;-2,4,3;-1,-3,3];
b=[1,5,0]';
[x,n]=jacobi(A,b,[0,0,0]',1.0e-6)
[x,n]=gauseidel(A,b,[0,0,0]',1.0e-6)
x =
0.9706
0.8529
1.1765
n =
35
x =
0.9706
0.8529
1.1765
n =
16
例4 分别用雅可比迭代法和高斯-赛德尔迭代法求解下列线性方程组,看是否收敛。
[ 1 − 2 2 1 1 1 2 2 1 ] \left[\begin{matrix} 1&-2&2\\ 1&1&1\\ 2&2&1 \end{matrix}\right] ⎣⎡112−212211⎦⎤ [ x 1 x 2 x 3 ] \left[\begin{matrix} x_1\\ x_2\\ x_3 \end{matrix}\right] ⎣⎡x1x2x3⎦⎤= [ 9 7 6 ] \left[\begin{matrix} 9\\ 7\\ 6 \end{matrix}\right] ⎣⎡976⎦⎤
A=[1,2,-2;1,1,1;2,2,1];
b=[9;7;6];
[x,n]=jacobi(A,b,[0;0;0],1.0e-6)
[x,n]=gauseidel(A,b,[0;0;0],1.0e-6)
x =
-27
26
8
n =
4
x =
NaN
NaN
NaN
n =
1012
直接法:以矩阵初等变换为基础,可以求得方程组的精确解;占用的内存空间大、程序实现较为复杂;一般适合求解低阶稠密线性方程组。
迭代法:从给定初始值逐步逼近精确解的过程,求解过程占用存储空间小,程序设计简单;适用于求解大型稀疏矩阵线性方程组;要考虑算法的收敛性。
大家学会了吗?另外分享给大家一个Markdown的公式神器- K a t e x \ Katex Katex ,为了编辑出优美的公式,大家可以多看看官方支持文档.最后没有一键三连,但欢迎大家
点赞,收藏⭐,转发,
如有问题、建议,请您在评论区留言哦。