MATLAB 高斯消元法求解线性方程组
MATLAB 高斯消元法求解线性方程组
clear;
clc;
A=[10 -7 0 1;-3 2.099999 6 2;5 -1 5 -1;2 1 0 2]; %定义系数矩阵A
b=[8;5.900001;5;1]; %定义常数向量b
[n,n] = size(A); %获取矩阵A的维度,n表示行数和列数都为n
x = zeros(n,1); %初始化解向量x,每个分量初始值为0
P = [1:n]; %初始化置换向量P,表示行的排列顺序为1~n
Aug = [A,b]; %构造增广矩阵,即把常数向量b加到系数矩阵A的右侧
for k = 1:n-1 %循环n-1次,每次消元一个未知量
[piv,r] = max(abs(Aug(k:n,k))); %找出主元所在行r和主元的值piv
r = r + k - 1; %将子矩阵中的行号r转换为大矩阵中的行号
if r>k %如果主元所在行不是第k行,进行行交换
Aug([k,r],:)=Aug([r,k],:); %交换增广矩阵中第k行和第r行的元素
P([k,r])=P([r,k]); %更新置换向量P
end
if Aug(k,k)==0 %如果主元为0,无法进行消元,报错
error('对角元出现0');
end
% 把增广矩阵消元成为上三角
for p = k+1:n %循环进行消元
Aug(p,:)=Aug(p,:)-Aug(k,:)*Aug(p,k)/Aug(k,k); %消元操作
end
end
% 解上三角方程组
A = Aug(:,1:n); %提取出消元后的系数矩阵
b = Aug(:,n+1); %提取出消元后的常数向量
x(n) = b(n)/A(n,n); %计算出最后一个未知量x_n
for k = n-1:-1:1 %循环逆推出x_1~x_{n-1}
x(k) = (b(k)-A(k,n:-1:k+1)*x(n:-1:k+1))/A(k,k); %逆推计算未知量
end
P %输出置换向量P
x %输出解向量x
detA=det(A) %计算系数矩阵A的行列式值,即方程组的解是否唯一,如果为0则表示无解或多解
代码逐句解析
clear;% 清空命令窗口clc;% 清空命令窗口中的内容A=[10 -7 0 1;-3 2.099999 6 2;5 -1 5 -1;2 1 0 2];% 定义系数矩阵Ab=[8;5.900001;5;1];% 定义常数向量b[n,n] = size(A);% 获取矩阵A的维度,n表示行数和列数都为nx = zeros(n,1);% 初始化解向量x,每个分量初始值为0P = [1:n];% 初始化置换向量P,表示行的排列顺序为1~nAug = [A,b];% 构造增广矩阵,即把常数向量b加到系数矩阵A的右侧for k = 1:n-1% 循环n-1次,每次消元一个未知量[piv,r] = max(abs(Aug(k:n,k)));% 找出主元所在行r和主元的值pivr = r + k - 1;% 将子矩阵中的行号r转换为大矩阵中的行号if r>k% 如果主元所在行不是第k行,进行行交换Aug([k,r],:)=Aug([r,k],:);% 交换增广矩阵中第k行和第r行的元素P([k,r])=P([r,k]);% 更新置换向量Pendif Aug(k,k)==0% 如果主元为0,无法进行消元,报错error('对角元出现0');endfor p = k+1:n% 循环进行消元Aug(p,:)=Aug(p,:)-Aug(k,:)*Aug(p,k)/Aug(k,k);% 消元操作endendA = Aug(:,1:n);% 提取出消元后的系数矩阵b = Aug(:,n+1);% 提取出消元后的常数向量x(n) = b(n)/A(n,n);% 计算出最后一个未知量x_nfor k = n-1:-1:1% 循环逆推出x_1~x_{n-1}x(k) = (b(k)-A(k,n:-1:k+1)*x(n:-1:k+1))/A(k,k);% 逆推计算未知量endP% 输出置换向量Px% 输出解向量xdetA=det(A)% 计算系数矩阵A的行列式值,即方程组的解是否唯一,如果为0则表示无解或多解
代码说明
该代码使用高斯消元法求解线性方程组,其核心思想是将增广矩阵通过初等行变换化为上三角矩阵,然后通过回代法求解未知量。代码中,Aug 矩阵存储了增广矩阵,P 向量存储了行交换信息,x 向量存储了解向量。
总结
该代码展示了使用 MATLAB 实现高斯消元法求解线性方程组的步骤,并对代码进行了逐句解析,方便读者理解。高斯消元法是一种常用的线性方程组求解方法,它在数值计算中具有广泛的应用。
注意事项
- 如果系数矩阵的行列式为0,则方程组无解或多解,代码会报错。
- 代码中的
max(abs(Aug(k:n,k)))是为了找到主元,如果主元为0,则无法进行消元,代码会报错。 - 代码中使用
error('对角元出现0');来处理主元为0的情况,可以根据实际情况进行修改。 - 代码中使用
det(A)计算系数矩阵的行列式值,可以通过行列式值判断方程组的解是否唯一。
希望以上内容能够帮助您理解高斯消元法和 MATLAB 代码。如果您还有其他问题,请随时提出。
原文地址: http://www.cveoy.top/t/topic/blud 著作权归作者所有。请勿转载和采集!