今天我们来聊聊数值方法里面一个很经典的问题,求解线性方程组。线性方程组是线代里面那个很重要的知识,而它本身的意义重大,在很多领域都会用到。求解问题,不知引出了多少数学分支,而线性方程组是一个很经典的求解问题,当然相对于其他的求解问题,它相对来说也简单很多,但是由它引领的知识却无比庞大…先看看线性方程组的用处吧:
- 用最小二乘法对实验离散数据进行拟合时候会用到线性方程组
- 诸多的插值问题也会用到线性方程组
- 还有我们高中就开始接触的生产与投入的问题。
- 在建筑、机械结构的设计需要计算线性方程组
线性方程组
我们把下面的方程组称为线性方程组,注意到它有以下的特点:
- 每个未知量的次数为1。
- 系数都是常数
如果方程组中共有n个未知量,就称为n元线性方程组。
{ a 11 x 1 + a 12 x 1 + . . . + a 1 n x 1 = b 1 a 21 x 1 + a 22 x 1 + . . . + a 2 n x 1 = b 2 . . . . . . . . . = . . . a n 1 x 1 + a n 2 x 1 + . . . + a n n x 1 = b n \left\{\begin{matrix} a_{11}x_1+ & a_{12}x_1+ & ...+ & a_{1n}x_1&=b_1\\ a_{21}x_1+ & a_{22}x_1+ & ...+ & a_{2n}x_1&=b_2\\ ...& ... & &...&=...\\ a_{n1}x_1+ & a_{n2}x_1+ & ...+ & a_{nn}x_1&=b_n\\ \end{matrix}\right. ⎩⎪⎪⎨⎪⎪⎧a11x1+a21x1+...an1x1+a12x1+a22x1+...an2x1+...+...+...+a1nx1a2nx1...annx1=b1=b2=...=bn
求解线性方程组的其中两种解法:
求解线性方程组的方法不只两种,但是我在这里介绍两种,一种是Cramer法则,一种是Gauss消元法。
- Cramer法则:本该在线代里面学过,但是如果你忘了或者是根本没有学好,请移步到https://blog.csdn.net/jackghq/article/details/90712570,这是CSDN中总结了Cramer法则的一篇较好的文章。
- 高斯消元法:高斯消元法相对于Cramer法则来说大大减少了时间复杂度,尤其是在使用计算机进行计算的时候,效果更加显著。我们主要学习高斯消元法。
几个要谈的问题:
设计算法的时候,我们要注意以下几个问题:
- 尽量不要把两个相近的数进行相减。两个及其相近的数进行相减,会使有效数字严重损失。其实有很多问题,我们都可以通过形变去改变其运算,而不会是它们相减。
- 尽量不要使用大数去加上一个小数。主要原因是因为,由于舍去误差(计算机有一定的精度),当一个大数加上一个小数的时候,会使的小数根本没有发挥作用。我们可以用小数除以大数。
- 尽量不要除以一个绝对值很小的数。除以一个很小的数,结果会很大很大,就会产生溢出现象
- 减少运算次数,也就是说减少时间复杂度。另外,运算次数多,每次运算都要产生无可避免的舍去误差,当误差积累时就会结果失真。
- 选用数值稳定的式子。式子尽量收敛或者可控。所以尽量不要使用连加或者连乘的方式。
直接方法:
- 什么叫做直接方法?
直接方法就是忽略舍去误差、可以求出精确值的方法,本次主要讨论两个直接方法,一个是Cramer法则,另一个就是gauss消元法。 - 但是有个问题:
就站在上述的第四条问题的观点上,我们看看Cramer需要多大的计算量:
按照行列式的定义计算(n个不同行不同列的元素外加一个符号),共有 ( n − 1 ) n ! (n-1)n! (n−1)n!次,然后根据Cramer法则就有 ( n + 1 ) ( n − 1 ) n ! (n+1)(n-1)n! (n+1)(n−1)n!次,如果有加入n=20,就需要约 9.7 × 1 0 20 9.7\times10^{20} 9.7×