《矩阵分析》代码Ⅱ
(一)gauss消元法
1.1 算法思想
(1)算法大体思想:
(2)算法具体实现:
1.2 matlab代码实现
function X=Gauss(A,B)
%%%此函数用于通过Gauss法,计算方程组的解;
%%%输入系数矩阵A和列向量B;
%%%输出方程组的解。
[n,~]=size(A);
AB=[A,B];
for k=1:n
for i=k+1:n
L=-AB(i,k)/AB(k,k);
AB(i,k)=0;
for j=k+1:n+1
AB(i,j)=AB(i,j)+L*AB(k,j);
end
end
end
a=AB(:,1:n); %%矩阵a为上三角矩阵
b=AB(:,n+1);
X=a_Back_subtitution(a,b); %%调用上三角矩阵的回代法计算。
注:关于第二步的回代法,直接调用了自定义的a_Back_subtitution(A,B)函数,关于该函数可以参考上一篇文章
https://blog.youkuaiyun.com/m0_46498899/article/details/109223781。最后小声说一句,没有a_Back_subtitution(A,B)函数是会报错的哟,所以记得把她也一起带走哟~~后面两种算法中也会用到滴
1.3 代码调用
(二)列主元素法
2.1 算法思想
在gauss消元法中,我们会发现:每进行一步都要用该步的主元素(即i步中的第i行第i列的元素)作为除数,如果某一步的主元素为0就无法进行,并且如果主元素是一个绝对值很小的数,在进行计算时就会造成截断误差过大,即产生“大数吃小数”的情况。因此我们需要对高斯消元法进行改进,于是列主元素法应运而生了。下面是关于列数元素法的算法思想:
2.2 matlab代码实现
在代码的实现之前小编有必要说明一下,gauss消元法的本质:将方程组变换为解相同的等价方程组。在系数矩阵上表现出来的是系数矩阵的上三角化。而列主元素法只是保证每一步计算是保证主元素是该列的最大元,从而在计算机计算过程中减小误差。
下面是具体的代码实现:
function X=Column(A,B)
%%%此函数用于通过列主元素法,计算方程组的解;
%%%输入系数矩阵A和列向量B;
%%%输出方程组的解X。
[n,~]=size(A);
AB=[A,B];
for k=1:n
LK=abs(AB(k:n,k)); %%%提取第k列中的第k行到第n行的元素并取绝对值;
M=max(LK);
if M==0
disp('error!!!输入的矩阵可能为奇异矩阵,请仔细检查。');
return
end
q=find(LK==M); %%%找出最大元素在所提取的列向量中的位置;
Rk=k+q(1)-1;
for j=k:n+1 %%%此for循环用于互换第k行和第k列主元素所在的第Rk行;
temp=AB(k,j);
AB(k,j)=AB(Rk,j);
AB(Rk,j)=temp;
end
for i=k+1:n %%%此for循环用于将第k列中第k行及以下元素化为0;;
L=-AB(i,k)/AB(k,k);
AB(i,k)=0;
for j=k+1:n+1
AB(i,j)=AB(i,j)+L*AB(k,j);
end
end
end
a=AB(:,1:n); %%%提取变换后的上三角矩阵;
b=AB(:,n+1); %%%提取方程右端的常数项(变换后)
X=(a_Back_subtitution(a,b)); %%%利用回代法将方程的解按顺序按行输出。
2.3代码调用
(三)总体主元素法
3.1算法思想
3.2 matlab代码实现
function X=Population(A,B)
%%%此函数用于通过总体主元素法,计算方程组的解;
%%%输入系数矩阵A和列向量B;
%%%输出方程组的解X。
[n,~]=size(A);
AB=[A,B];
for k=1:n
LK=abs(AB(k:n,k:n)); %%%提取第k列到第n列中的第k行到第n行的元素并取绝对值;
M=max(LK);
if M==0
disp('error!!!输入的矩阵可能为奇异矩阵,请仔细检查。');
return
end
[p,q]=find(LK==M); %%%找出最大元素在所提取的列向量中的位置;
p=k+p(1)-1;
q=k+q(1)-1;
X_temp=1:n;
temp0=X_temp(k);
X_temp(k)=X_temp(q);
X_temp(q)=temp0;
for j=k:n+1 %%%此for循环用于互换第k行和第p行;注意:
temp1=AB(k,j); ...由于此两行的第1到第k-1列元素为零,所以互换此两行的第k列到第n+1列;
AB(k,j)=AB(p,j);
AB(p,j)=temp1;
end
for i=1:n %%%此for循环用于互换第kL列和第q列;
temp2=AB(i,k);
AB(i,k)=AB(i,q);
AB(i,q)=temp2;
end
for i=k+1:n %%%此for循环用于将第k列中第k行及以下元素化为0;
L=-AB(i,k)/AB(k,k);
A(i,k)=0;
for j=k+1:n+1
AB(i,j)=AB(i,j)+L*AB(k,j);
end
end
end
a=AB(:,1:n); %%%提取变换后的上三角矩阵;
b=AB(:,n+1); %%%提取方程右端的常数项(变换后)
XX=(a_Back_subtitution(a,b)); %%%将方程的解按顺序按行输出。
X=zeros(n,1);
for m=1:n
k=X_temp==m;
X(m)=XX(k);
end