【作业内容】:解线性方程组:
[
3.01
6.03
1.96
1.348
6.65
0.002
1.47
−
4.81
9.34
]
∗
[
x
1
x
2
x
3
]
=
[
11
8
6
]
\left[\begin{matrix}3.01 & 6.03 & 1.96\\1.348 & 6.65 & 0.002\\ 1.47 & -4.81 & 9.34\\ \end{matrix}\right]*\left[\begin{matrix}x_{1}\\x_{2}\\ x_{3}\\ \end{matrix}\right]= \left[\begin{matrix}11\\8\\ 6\\ \end{matrix}\right]
⎣⎡3.011.3481.476.036.65−4.811.960.0029.34⎦⎤∗⎣⎡x1x2x3⎦⎤=⎣⎡1186⎦⎤
-
高斯消去法
用高斯消去法求解上述方程组,输出消元过程以及 A x = b Ax=b Ax=b中矩阵 A A A、 b b b、解向量 x x x及 d e t A detA detA。
-
高斯列主元消去法
用高斯列主元消去法求解上述方程组,输出列主元选取、消元过程,包括行交换次序, A x = b Ax=b Ax=b中矩阵 A A A、 b b b、解向量 x x x及 d e t A detA detA。
-
比较两种消去法. 用MATLAB的内部函数 i n v inv inv求出系数矩阵的逆矩阵,再输入命令 x = i n v ( A ) ∗ b x=inv(A)*b x=inv(A)∗b, 即可求出上述两个方程组的解。并与高斯消去法、高斯列主元消去法求出的解进行比较,体会选主元的方法具有良好的数值稳定性。
说明:计算过程保留小数点以后8位数字
高斯消去法
- matlab代码如下
% Gauss.m
% 高斯法求解线性方程组Ax=b
% A为输入矩阵系数,b为方程组右端系数
% 方程组的解保存在x变量中
% 先输入方程系数
% 设置计算过程的默认精度
digits(9);
A = vpa([3.01,6.03,1.96; 1.348,6.65,0.002; 1.47, -4.81,9.34])
disp('detA=')
disp(det(A))
b = [11,8,6]'
[m,n]=size(A);
%检查系数正确性
if m~=n
error('矩阵A的行数和列数必须相同');
return;
end
if m~=size(b)
error('b的大小必须和A的行数或A的列数相同');
return;
end
%再检查方程是否存在唯一解
if rank(A)~=rank([A,b])
error('A矩阵的秩和增广矩阵的秩不相同,方程不存在唯一解');
return;
end
%这里采用增广矩阵行变换的方式求解
c=n+1;
A(:,c)=b;
%高斯消元,输出消元过程
disp('高斯消元:');
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);
高斯列主元消去法
- matlab代码如下
% Column_Gauss.m
% 高斯法求解线性方程组Ax=b
% A为输入矩阵系数,b为方程组右端系数
% 方程组的解保存在x变量中
% 先输入方程系数
% 设置计算过程的默认精度
digits(9);
A = vpa([3.01,6.03,1.96; 1.348,6.65,0.002; 1.47, -4.81,9.34])
disp('detA=')
disp(det(A))
b = [11,8,6]'
[m,n]=size(A);
%检查系数正确性
if m~=n
error('矩阵A的行数和列数必须相同');
return;
end
if m~=size(b)
error('b的大小必须和A的行数或A的列数相同');
return;
end
%再检查方程是否存在唯一解
if rank(A)~=rank([A,b])
error('A矩阵的秩和增广矩阵的秩不相同,方程不存在唯一解');
return;
end
%这里采用增广矩阵行变换的方式求解
c=n+1;
A(:,c)=b;
for i=1:n
disp(['第',num2str(i),'次交换列主元前:'])
disp(A);
[max_col,position_to_i]= max(abs(A(i:end,i)));%只考虑i后的行列,选取绝对值较大的作为主元
if max_col == 0
error('主对角元是0,无唯一解,无法用高斯主列消元法解');
end
%交换最大元列 的行
max_col_rowposition = position_to_i+i-1;%列中的实际位置..
if max_col_rowposition ~= i
temp = A(i,:);
A(i,:) = A(max_col_rowposition,:);
A(max_col_rowposition,:) = temp;
end
disp(['第',num2str(i),'次交换列主元后:'])
disp(A);
for j = (i+1):n
A(j,:) = A(j,:) - A(j,i) / A(i,i) * A(i,:);
end
disp(['第',num2str(i),'次消元后:'])
disp(A);
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);
Matlab逆矩阵求解
A = [3.01,6.03,1.96; 1.348,6.65,0.002; 1.47, -4.81,9.34];
b = [11,8,6]';
x = inv(A)*b;
disp(x);