要求:
①编写一个function,求解AX=b,即输入为A,b,但A只能是上三角或下三角矩阵。
②编写一个function,求解AX=b,利用高斯消去法(包括选主元和不选主元),调用①function求解X。
③编写一个function,对矩阵A进行doolittle分解,输出单位下三角矩阵L和上三角矩阵U;若选主元,同时输出置换矩阵P。
④编写一个function对正定矩阵A进行cholesky分解,输出下三角矩阵L;
理论:
①求解线性方程组一般的求解方法有俩种,一个是直接求解法,一个是迭代法。
②直接法就是通过有限步四则运算的方程准确解的方法。但实际计算中必然存在舍入误差,因此这种方法只能得到近似解。
③迭代法是先给一个解的初始近似值,然后按一定法则求出更准确的解,即用某种极限过程逐步逼近准确解的方法。
matlab代码:
1.求解AX=b(A为上三角)
function x=slo(A,b)
n = length(b);
x = zeros(n,1);
x(n) = b(n)/A(n,n);
if istriu(A)
for i = n-1:-1:1
x(i) = (b(i)-A(i,i+1:n)*x(i+1:n))/A(i,i);
end
else
disp("输入错误,请输入上三角")
end
end
2.使用高斯消去法求解AX=b(包括选主元和不选主元)
不选主元
%不选主元
digits(9);
A = vpa([10^-8,2,3;-1,3.712,4.623;-2,1.072,5.643]);
b = [1;2;3]';
[m,n]=size(A);
%检查方程组是否存在唯一解
if rank(A)~=rank([A,b])
error('矩阵A的秩和增广矩阵的秩不相同,方程不存在唯一解');
return;
end
%增广矩阵行变换求解
c=n+1;
A(:,c)=b;
%高斯消元
for k=1:n-1
A(k+1:n, k:c) = A(k+1:n, k:c)-(A(k+1:n,k)/ A(k,k))*A(k, k:c)
end
%回代求结果
x=zeros(length(b),1);
x(n)=A(n,c)/A(n,n);
for k=n-1:-1:1
x(k)=(A(k,c)-A(k,k+1:n)*x(k+1:n))/A(k,k);
end
%计算结果
disp('x=');
disp(x);
运行结果:
选主元
%选主元
clc;clear all;
A = [10^-8,2,3;-1,3.712,4.623;-2,1.072,5.643];
b = [1;2;3];
n = length(A);
m = zeros(n);%存放行乘数
format long
for k = 1:n-1
temp = abs(A(k:n,k));%比较绝对值的最大值
[value index] = max(temp);%选主元
u = index + k - 1;%调整为正确的最大行的索引
if u ~= k %选主元,换行
temp1 = A(u,k:n);
temp2 = b(u);
A(u,k:n) = A(k,k:n);
b(u) = b(k);
A(k,k:n) = temp1;
b(k) = temp2;
end
m(k+1:n,k) = A( k+1:n,k)/A(k,k);%计算行乘数
A(k+1:n,k:n) = A(k+1:n,k:n) - m(k+1:n,k)*A(k,k:n);
b(k+1:n) = b(k+1:n) - m(k+1:n,k)*b(k);
end
slo(A,b); %调用回代求解过程
运行结果:
3.矩阵A进行doolittle分解(包括选主元和不选主元)
function doolittle_1(A)
[row,list] = size(A);
P = eye(row);%置换矩阵P
for k = 1:row-1
A(k:row,k) = A(k:row,k) - A(k:row,1:k-1) * A(1:k-1,k);
temp = abs(A(k:row,k));
[value index] = max(temp);%选主元
u = index + k - 1;
if u ~= k %换行
temp1 = A(u,:);
A(u,:) = A(k,:);
A(k,:) = temp1;
temp1 = P(u,:);
P(u,:) = P(k,:);
P(k,:) = temp1;
end
A(k+1:row,k) = A(k+1:row,k) / A(k,k);
A(k,k+1:list) = A(k,k+1:list) - A(k,1:k-1)*A(1:k-1,k+1);
end
k = row;
A(k,k:list) = A(k,k:list) - A(k,1:k-1)*A(1:k-1,k:list);
L = eye(row);
for i = 2:row
L(i,1:i-1) = A(i,1:i-1);
end
U = zeros(row);
for i = 1:row
U(i,i:row) = A(i,i:row);
end
P = vpa(P)
L = vpa(L)
U = vpa(U)
运行结果:
4.cholesky分解
%cholesky分解
function Cholesky(A)
[N,N]=size(A);
X=zeros(N,1);
Y=zeros(N,1);
for i=1:N
A(i,i)=sqrt(A(i,i)-A(i,1:i-1)*A(i,1:i-1)');
for j=i+1:N
A(j,i)=(A(j,i)-A(j,1:i-1)*A(i,1:i-1)')/A(i,i);
end
end
for x=1:N
for y=1:N
B(x,y)=A(x,y);
if x<y
B(x,y)=0;
break;
end
end
end
L=vpa(B)
运行结果: