function x=LUfenjiefa(A,b)
n=length(b);
k=2;
X=A;
Y=b;U(1,1:n)=A(1,1:n);L(2:n,1)=A(2:n,1)/U(1,1);for k=2:n
U(k,k:n)=A(k,k:n)-L(k,1:k-1)*U(1:k-1,k:n);L(k+1:n,k)=(A(k+1:n,k)-L(k+1:n,1:k-1)*U(1:k-1,k))/U(k,k);end
L
U
%用向前消去法解下三角方程组Ly=b
y=zeros(n,1);y(1)=b(1);for k=2:n
y(k)=b(k)-L(k,1:k-1)*y(1:k-1);end
y
%用回代法解上上角方程组Ux=y
x=zeros(n,1);x(n)=y(n)/U(n,n);for k=n-1:-1:1x(k)=(y(k)-U(k,k+1:n)*x(k+1:n))/U(k,k);endend
6 选取列主元的Doolittle分解法求解线性方程组
function x =Doolittle(A,b)% 假设A的各阶顺序主子式均不为零
n =length(A);
L =eye(n);
U =zeros(n);%length(A)返回矩阵A最大维数;%eye(n) 返回一个主对角线元素为 1 且其他位置元素为 0 的 n×n 单位矩阵。for k =1:n-1fori= k:n
% 计算下三角矩阵L第k列元素的一部分s(i)=A(i,k)-L(i,1:k-1)*U(1:k-1,k);end%选列主元[~,q]=max(abs(s(k:n)));
q = q+k-1;%还原s(i)的索引下标% 若q!=kif q>k %绝对值最大的列主元不在第q行即当前第一行% 交换A的第k行与第q行
t_A =A(k,:);A(k,:)=A(q,:);A(q,:)= t_A;% 交换下三角矩阵L第k列元素s_k与s_q(l_kk与l_qk)
t_s =s(k);s(k)=s(q);s(q)= t_s;% 将下三角矩阵L的第k行前(k-1)个元素与第q行的前(k-1)个元素交换
t_L =L(k,1:k-1);L(k,1:k-1)=L(q,1:k-1);L(q,1:k-1)= t_L;% 交换b_k与b_q
t_b =b(k);b(k)=b(q);b(q)= t_b;end% 计算矩阵U的第k行元素及矩阵L的第k列元素U(k,k)=s(k);fori= k+1:n
U(k,i)=A(k,i)-L(k,1:k-1)*U(1:k-1,i);L(i,k)=s(i)/U(k,k);endend% 求解上三角矩阵第n行的唯一待定元素u_nnU(n,n)=A(n,n)-L(n,1:n-1)*U(1:n-1,n);% 解单位下三角方程组Ly=b
y =zeros(n,1);for k =1:n
if k==1y(1)=b(1);elsey(k)=b(k)-L(k,1:k-1)*y(1:k-1);endend% 解上三角方程组Ux=y
x =zeros(n,1);for k = n:-1:1if k==n
x(n)=y(n)/U(n,n);elsex(k)=(y(k)-U(k,k+1:n)*x(k+1:n))/U(k,k);endend
x = x';end
7 解线性方程组系数矩阵为三对角矩阵的追赶法
%行对角占优条件:% (1)比较绝对值,第一行的主对角元大于第一行的另一个非零元,且绝对值均不为零% (2)比较绝对值,最后一行的主对角元大于最后一行的另一个非零元,且绝对值均不为零% (3)第一行和最后一行之外的其余各行,主对角元的绝对值大于另外两个非零元的绝对值之和且均不为0%说明:% 矩阵A的主对角线元素为d(1)~d(n)% 次下对角线元素为a(2)~a(n)% 次上对角线元素为c(1)~c(n-1)function x =ForwardBackward(a,b,c,d)
n =length(d);% 输入4个一维数组a,c,d(存放A的三条对角线上的元素),b(Ax=b,列向量)% 若d(1)==0,则输出信息"方法失败!",算法终止。ifd(1)==0warning('方法失败!')returnendp(1)=d(1);q(1)=c(1)/d(1);fori=2:n-1p(i)=d(i)-a(i)*q(i-1);% 若p(i)=0,则输出信息"方法失败!",算法终止(可以证明系数矩阵A满足对角占优条件,则p(1)~p(n)均不为0)ifp(i)==0warning('方法失败!')returnendq(i)=c(i)/p(i);endp(n)=d(n)-a(n)*q(n-1);% 算法终止条件判断ifp(n)==0warning('方法失败!')returnend% 解下三角方程组Ly=by(1)=b(1)/p(1);fori=2:n
y(i)=(b(i)-a(i)*y(i-1))/p(i);end% 解上三角方程组Ux=yx(n)=y(n);fori= n-1:-1:1x(i)=y(i)-q(i)*x(i+1);endend
8 利用SOR(逐次超松弛)迭代法解线性方程组
%% 用SOR(Successive Over-Relaxation,逐次超松弛)迭代法解n阶线性方程组Ax=bfunction x =SOR(A,b,omega,x0,eps,N)% 其中松弛因子omega(ω),初始向量x0,精度eps,最大迭代次数N%步骤1:输入矩阵A,右端向量b,松弛因子ω和初始向量x0,精度eps和最大迭代次数N。令k=0
n=length(x0);
x=ones(n,1);k=0;%x其实可以设定为任意值,不影响后面的迭代和覆盖过程,设为全部元素为1的列向量纯粹为了表示方便%步骤2:当k≤N时,执行步骤2.1~2.3while k<=N
%步骤2.1:对i=1,2,...n,计算x_i(k+1)表达式fori=1:n
x(i)= omega*(-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n)+b(i))/A(i,i)+(1-omega)*x0(i);end%步骤2.2:令k:=k+1
k=k+1;%步骤2.3:若||x(k+1)-x(k)||<eps,则算法停止,输出方程组近似解x(k+1);否则令x_k:=x_k+1。if(norm(x-x0,inf)<eps),break;end
x0=x;end%步骤3:输出信息“算法超出最大迭代次数!”,算法终止。if k>N
warning('算法超出最大迭代次数!');elsedisp(['迭代次数= ',num2str(k)]);
x
endend