[关闭]
@codejan 2017-04-16T02:57:01.000000Z 字数 2180 阅读 1364

线性代数方程组的数值解法

数学实验


高斯消元法

求解方程组

  1. A = {{1, 2}, {3, 4}}
  2. B = {5, 6}
  3. LinearSolve[A, B]
  4. >> {-4, 9/2}

LU分解

维基百科

LU分解在本质上是高斯消元法的一种表达形式。实质上是将A通过初等行变换变成一个上三角矩阵,其变换矩阵就是一个单位下三角矩阵。这正是所谓的杜尔里特算法(Doolittle algorithm):从下至上地对矩阵A做初等行变换,将对角线左下方的元素变成零,然后再证明这些行变换的效果等同于左乘一系列单位下三角矩阵,这一系列单位下三角矩阵的乘积的逆就是L矩阵,它也是一个单位下三角矩阵。

应用:

求解方程组

  1. 将A进行LU分解,
  2. 求解方程组得到
  3. 求解方程组得到

注记:在两次的求解中,我们遇到的都是三角矩阵,因此运用向前(向后)替代法就可以简洁地求解(参见三角矩阵),而不需要用到高斯消元法。然而,在将A进行LU分解时,仍然要用到高斯消元法。因此,这个方法适合在要对许多个不同的b求解时用


解的误差分析

由于实际问题导出的线性方程组中,往往带有误差(扰动),解得误差分析是讨论的微小变化对的影响.如果对系数的微小扰动引起解的很大变化,我们称为病态线性方程组,线性矩阵称为病态矩阵.
首先引入矩阵的范数
维基百科:矩阵范数
通过阅读wiki,我们发现只要是矩阵到实数的一个映射,满足严格正定性,线性性和三角不等式,就可称作一个范数
矩阵范数的度量有很多种,比较常见的是:


维基百科:矩阵条件数

求解线性方程组迭代方法(p100)

(p111 题5)已知方程组,其中,是一个五对角矩阵,主对角线值均为(自己定),旁边两条副对角线值为,再旁边两条值为,接下来我们采用两种方法,尝试不同的初值和来迭代求解.

  1. n = 3;
  2. B = diag(1/6*ones(1,19),1)+diag(1/6*ones(1,19),-1)+diag(1/12*ones(1,18),2)+diag(1/12*ones(1,18),-2)
  3. %diag(a,i)代表主对角线向上偏移i条对角线为a向量,其他为0所生成的矩阵
  4. %坑爹啊,matlab不能随便换行
  1. t = 10 %迭代次数
  2. b = zero(20,1) %20个零的列向量
  3. x = rand(20,t); %生成随机数作为初值
  4. for i=2:t
  5. x(:,i)=A1*x(:,i-1)+b;
  6. end
  7. x %观察结果,发现快速收敛到0,正确
  8. %我们采用以下两种不同的方程组右端项
  9. b = ones(20,1) %观察结果,发现快速收敛
  10. b = [9/4,7/4,3/2*ones(1,16),7/4,9/4]
  11. %注意此时b要转置再除以3
  12. %这是凑好了解向量全部为1的情况,观察结果,发现快速收敛
  13. %我们尝试修改初值的范围,并计算多少次迭代可以使迭代误差小于1e-5
  14. x = 100*rand(20,t)
  15. x = 100000*rand(20,t)
  16. for i = 2:t
  17. if max(abs(x(:,i)-x(:,i-1)))<1e-5
  18. i
  19. break
  20. end
  21. end
  22. 计算得33次迭代可以小于1e-5(指数速度收敛)
  23. 最后我们研究主对角线元素大小的影响
  24. n = 10000;
  25. format long
  26. A1 = diag(1/(n*2)*ones(1,19),1)+diag(1/(n*2)*ones(1,19),-1)+diag(1/(n*4)*ones(1,18),2)+diag(1/(n*4)*ones(1,18),-2)
  27. t = 50;
  28. b = [9/4,7/4,3/2*ones(1,16),7/4,9/4]+n-3
  29. x = 1*rand(20,t);
  30. for i=2:t
  31. x(:,i)=A1*x(:,i-1)+b'/n;
  32. end
  33. x
  34. for i = 2:t
  35. if max(abs(x(:,i)-x(:,i-1)))<1e-5
  36. i
  37. break
  38. end
  39. end
  40. 发现n越大,收敛速度越快10-8,100-6,1000000-4
  1. n = 3;
  2. format long
  3. A1= diag(1/6*ones(1,19),1)+diag(1/6*ones(1,19),-1)+diag(1/12*ones(1,18),2)+diag(1/12*ones(1,18),-2)
  4. t = 50;
  5. b = zeros(20,1);
  6. x = 10000*rand(20,1);
  7. for i=2:t
  8. for j=1:20
  9. x(j)=A1(j,:)*x+b(j);
  10. end
  11. end
  12. x
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注