声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2598|回复: 0

[编程技巧] 用matlab实现高斯列主元消去法解线性方程及LU分解

[复制链接]
发表于 2016-5-12 09:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
  1. <font face="Times New Roman">
  2. 用matlab实现高斯列主元消去法解线性方程及LU分解

  3. function x=gaussLinearEquation(A,b)

  4. %高斯法解线性方程Ax=b

  5. disp('原方程为AX=b:')

  6. A

  7. b

  8. disp('------------------------')

  9. n=length(b);

  10. eps=10^-2;

  11. for k=1:n-1

  12.     %找列主元

  13.     [mainElement,index]=max(abs(A(k:n,k)));

  14.     index=index+k-1;%index在A(k:n,k)中的行号转换为在A中的行号

  15.     if abs(mainElement)<eps

  16.         disp('列元素太小!!');

  17.         break;

  18.     elseif index>k

  19.         %列主元所在行不是当前行,将当前行与列主元所在行交换

  20.         temp=A(k,:);

  21.         A(k,:)=A(index,:);

  22.         A(index,:)=temp;

  23.     end

  24.     %消元

  25.     for i=k+1:n

  26.         m(i,k)=A(i,k)/A(k,k);%A(k,k)将A(i,k)消为0所乘系数

  27.         A(i,k:n)=A(i,k:n)-m(i,k)*A(k,k:n);%第i行消元处理

  28.         b(i)=b(i)-m(i,k)*b(k);%还有b也需要处理!!      

  29.     end

  30. end

  31. disp('消元后所得到的上三角阵是')

  32. A

  33. %回代

  34. b(n)=b(n)/A(n,n);

  35. for i=n-1:-1:1

  36.     %sum(A(i,i+1:n).*b(i+1:n)')表示已知

  37.     b(i)=(b(i)-sum(A(i,i+1:n).*b(i+1:n)'))/A(i,i);

  38. end

  39. clear x;

  40. x=b;

  41. disp('AX=b的解x是')

  42. x

  43. 用法:

  44. 在控制台输入:

  45. A=[1.003 0.333 1.504 -0.333;

  46.    -2.011 1.455 0.506 2.956;

  47.    4.329 -1.952 0.006 2.087;

  48.    5.113 -4.004 3.332 -1.112];

  49. b=[ 3.005,5.407,0.136,3.772 ]';

  50. 执行gaussLinearEquation(A,b);即可得到结果。

  51. 使用matlab实现矩阵的LU分解
  52. function [L,U]=myLU(A)
  53. %实现对矩阵A的LU分解,L为下三角矩阵
  54. A
  55. [n,n]=size(A);
  56. L=zeros(n,n);
  57. U=zeros(n,n);
  58. for i=1:n
  59.     L(i,i)=1;
  60. end
  61. for k=1:n
  62.     for j=k:n
  63.         U(k,j)=A(k,j)-sum(L(k,1:k-1).*U(1:k-1,j)');
  64.       
  65.     end
  66.     for i=k+1:n
  67.         L(i,k)=(A(i,k)-sum(L(i,1:k-1).*U(1:k-1,k)'))/U(k,k);      
  68.     end
  69.    
  70. end
  71. 用法,在控制台输入
  72. A=[1 2 3 -4;-3 -4 -12 13;2 10 0 -3;4 14 9 -13];
  73. 然后执行[l,u]=myLU(A);
  74. 这样得到l和u,可以通过l*u与A比较来验证LU分解的正确性。

  75. 注意:
  76. [L1,U1]=lu(x)
  77. [L2,U2,P]=lu(x)
  78. [L3,U3,P,Q] = lu(X)
  79. MATLAB中[L1,U1]=lu(x)的结果:L是下三角的置换矩阵即L1=p*L2,U是上三角阵。Matlab中LU分解采用高斯消元法,结果是不唯一的,只要[L1,U1]=lu(x)满足L1*U1=x, [L2,U2,P]=lu(x)满足L2*U2=p*x,[L3,U3,P,Q] = lu(X)满足 L3*U3= P*X*Q就行了。</font>
复制代码
转自:http://blog.sina.com.cn/s/blog_49c02a8c0100yt1x.html
回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-26 02:07 , Processed in 0.136047 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表