不选主元的Gauss消去法和列主元高斯消去法求解三对角矩阵
采用 MATLAB 语言不选主元和列主元 Gauss 消去法编写成通用的子程序;然后用编写的程序求解 下列84阶方程组。问题描述:求解的所有步骤及程序请详细见数值线性代数\Linear Equation Direct Solution_1\Computer_problem1.m 这里仅说明伪代码算法和求解结果,步骤如下:步骤一、 采用程序生成方程组的矩阵A和向量 b,并用命令xlswrite(fi
·
采用 MATLAB 语言不选主元和列主元 Gauss 消去法编写成通用的子程序;然后用编写的程序求解 下列84阶方程组。
问题描述:求解的所有步骤及程序请详细见数值线性代数\Linear Equation Direct Solution_1\Computer_problem1.m 这里仅说明伪代码算法和求解结果,步骤如下:
- 步骤一、 采用程序生成方程组的矩阵A和向量 b,并用命令xlswrite(filename) 将其保存为 excel文件,在使用时用xlsread 命令读取文件获取数据;
A = x l s r e a d ( ′ t e s t d a t a 1. x l s x ′ ) ; b = x l s r e a d ( ′ t e s t d a t a 1 b . x l s x ′ ) ; A = xlsread('testdata1.xlsx'); b = xlsread('testdata1_b.xlsx'); A=xlsread(′testdata1.xlsx′);b=xlsread(′testdata1b.xlsx′); - 步骤二、调用不选主元的Gauss 消去法的通用子程序 GaussDirectLU.m,具体如下:
% 方法1: 采用不选主元的高斯消去法,对方程组进行求解:
[ L , U ] = G a u s s D i r e c t L U ( A ) ; [L,U] = GaussDirectLU(A); [L,U]=GaussDirectLU(A);
% 让 Ux = y则,Ly = b; 其中L、U分别为下三角矩阵和上三角矩阵
% 对方程 Ly=b、Ux=y 分别采用前代法和回代法
y = F o r m e r S o l u t i o n ( L , b ) ; x 1 = B a c k S o l u t i o n ( U , y ) ; y = FormerSolution(L,b); x1 = BackSolution(U,y); y=FormerSolution(L,b);x1=BackSolution(U,y); - 步骤三、调用列主元 Gauss 消去法的通用子程序 ColumnGaussian.m,具体如下:
% 方法2: 采用列主元的高斯消去法,对方程组进行求解:
x2 = ColumnGaussian(A,b) % 得到方程的解为:86*1的向量 - 步骤四、计算的结果与方程组的精确解进行比较,由步骤二、三分别求得的解为 x1、x2
,且不难得到方程组的精确解为 x = ones(1,86);
对比精确解 x 与求得 x1、x2 之差的 2 范数:
采用不选主元的 Gauss 消去法得到的解与精确解的二范数为: 2903750665.613814
采用列主元的 Gauss 消去法得到的解与精确解的二范数为: 0.000015
查找 x1 的病态解即x(i)> 100的最小 i :
从62 个解开始不选主元的高斯消去法开始出现病态解其为 256.984367
将精确解 x 与求得 x1、x2 直观地展示在二维的图表中:
从图表中我们可以清晰的看出,采用不选主元的高斯消去法、列主元高斯消去法求的结果和精确解之间的对比,列主元高斯消去法的解和精确解基本吻合,不选主元的高斯消去法与精确解随着求解过程中误差的传递、积累,导致后面的解与精确解完全不吻合,且出现较大的波动,其中x(86) = 2147352577, 可以看出列主元高斯消去法的效果较好,且相较于全局选主元法计算量小,精度符合运算要求。
附其中的调用程序:
clear %清理数据
clc %清理输出窗口
% 读取题目所需数据
A = xlsread('testdata1.xlsx');
b = xlsread('testdata1_b.xlsx');
x = ones(86,1);
fprintf('====================== 第一章 上机习题1 ====================== \n');
%%
% 方法1: 采用不选主元的高斯消去法,对方程组进行求解:
[L,U] = GaussDirectLU(A);
% 让 Ux = y则,Ly = b; 其中L、U分别为下三角矩阵和上三角矩阵
% 对方程 Ly=b、Ux=y 分别采用前代法和回代法
y = FormerSolution(L,b);
%norm(b - L*y,1)
x1 = BackSolution(U,y);
%norm(y - U*x1,1)
%%
%鉴于之前数据存在被修改的风险,再次读取数据
A = xlsread('testdata1.xlsx');
b = xlsread('testdata1_b.xlsx');
% 方法2: 采用列主元的高斯消去法,对方程组进行求解:
x2 = GaussianColumn1(A,b); % 得到方程的解为:86*1的向量
%norm(b-A*x2,1)
%%
% 将精确解 x 与求得 x1、x2 展示在二维的图表中:
figure
i = 1:1:86;
plot(i,x,i,x1,'--',i,x2,'r*');
grid on;
legend('Exact Solution','Direct Guass Solution','Column Gaussian ');
title('\bf The Comparison of Solution');
xlabel('\bf The Variables x');
ylabel('\bf Solution of Equation');
%%
% 精确解 x 与求得 x1、x2 之差的 2 范数
z1 = x - x1;
z2 = x - x2;
loss1 = norm(z1,2);
loss2 = norm(z2,2);
fprintf('采用不选主元的 Gauss 消去法得到的解与精确解的二范数为: %f\n',loss1);
fprintf('采用列主元的 Gauss 消去法得到的解与精确解的二范数为: %f\n',loss2);
%%
% 查找 x1 的病态解即x(i)> 100的最小 i
for i = 1:86
if x1(i)>100
fprintf('从%d个解开始不选主元的高斯消去法开始出现病态解其为 %f \n',i,x1(i));
break;
end
end
更多推荐
所有评论(0)