首页 / 更多教程 / 高斯消元法和列主元素法
高斯消元法和列主元素法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了高斯消元法和列主元素法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4309字,纯文字阅读大概需要7分钟。
内容图文
![高斯消元法和列主元素法](/upload/InfoBanner/zyjiaocheng/1038/68e74fb4f9e54372862f08ad906a4a89.jpg)
高斯消元法
设线性方程组
A
x
=
b
Ax=b
Ax=b,其中
(
A
(
1
)
,
b
(
1
)
)
=
(
a
11
(
1
)
a
12
(
1
)
a
13
(
1
)
…
a
1
n
(
1
)
b
1
(
1
)
a
21
(
1
)
a
22
(
1
)
a
23
(
1
)
…
a
2
n
(
1
)
b
2
(
1
)
a
31
(
1
)
a
32
(
1
)
a
33
(
1
)
…
a
3
n
(
1
)
b
3
(
1
)
?
?
?
?
?
?
a
n
1
(
1
)
a
n
2
(
1
)
a
n
3
(
1
)
…
a
n
n
(
1
)
b
n
(
1
)
)
(A^{(1)},b^{(1)})= \left(\begin{array}{cccccc} a_{11}^{(1)} & a_{12}^{(1)} & a_{13}^{(1)} & \ldots & a_{1 n}^{(1)} & b_{1}^{(1)} \\ a_{21}^{(1)} & a_{22}^{(1)} & a_{23}^{(1)} & \ldots & a_{2 n}^{(1)} & b_{2}^{(1)} \\ a_{31}^{(1)} & a_{32}^{(1)} & a_{33}^{(1)} & \ldots & a_{3 n}^{(1)} & b_{3}^{(1)} \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ a_{n 1}^{(1)} & a_{n 2}^{(1)} & a_{n 3}^{(1)} & \ldots & a_{n n}^{(1)} & b_{n}^{(1)} \end{array}\right)
(A(1),b(1))=?????????a11(1)?a21(1)?a31(1)??an1(1)??a12(1)?a22(1)?a32(1)??an2(1)??a13(1)?a23(1)?a33(1)??an3(1)??………?…?a1n(1)?a2n(1)?a3n(1)??ann(1)??b1(1)?b2(1)?b3(1)??bn(1)???????????
用高斯消元法时,步骤如下:
- 计算
?
l
i
1
=
?
a
i
1
(
1
)
a
11
(
1
)
,
(
i
=
2
,
3
,
.
.
.
,
n
)
-l_{i1}=-\frac{a^{(1)}_{i1}}{a^{(1)}_{11}},(i=2,3,...,n)
?li1?=?a11(1)?ai1(1)??,(i=2,3,...,n),然后将矩阵的第一行乘这个系数分别加到每一行,这样,第一列的对角元一下就全是0。
( A ( 2 ) , b ( 2 ) ) = ( a 11 ( 1 ) a 12 ( 1 ) a 13 ( 1 ) … a 1 n ( 1 ) b 1 ( 1 ) 0 a 22 ( 2 ) a 23 ( 2 ) … a 2 n ( 2 ) b 2 ( 2 ) 0 a 32 ( 2 ) a 33 ( 2 ) … a 3 n ( 2 ) b 3 ( 2 ) ? ? ? ? ? ? 0 a n 2 ( 2 ) a n 3 ( 2 ) … a n n ( 2 ) b n ( 2 ) ] \left(A^{(2)}, b^{(2)}\right)=\left(\begin{array}{cccccc} a_{11}^{(1)} & a_{12}^{(1)} & a_{13}^{(1)} & \ldots & a_{1 n}^{(1)} & b_{1}^{(1)} \\ 0 & a_{22}^{(2)} & a_{23}^{(2)} & \ldots & a_{2 n}^{(2)} & b_{2}^{(2)} \\ 0 & a_{32}^{(2)} & a_{33}^{(2)} & \ldots & a_{3 n}^{(2)} & b_{3}^{(2)} \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & a_{n 2}^{(2)} & a_{n 3}^{(2)} & \ldots & a_{n n}^{(2)} & b_{n}^{(2)} \end{array}\right] (A(2),b(2))=?????????a11(1)?00?0?a12(1)?a22(2)?a32(2)??an2(2)??a13(1)?a23(2)?a33(2)??an3(2)??………?…?a1n(1)?a2n(2)?a3n(2)??ann(2)??b1(1)?b2(2)?b3(2)??bn(2)???????????
然后用除去第一行和第一列的矩阵重复上述步骤,n-1步之后,将会得到
( A ( n ) , b ( n ) ) = ( a 11 ( 1 ) a 12 ( 1 ) a 13 ( 1 ) … a 1 n ( 1 ) b 1 ( 1 ) a 22 ( 2 ) a 23 ( 2 ) … a 2 n ( 2 ) b 2 ( 2 ) a 33 ( 3 ) … a 3 n ( 3 ) b 3 ( 3 ) ? ? ? a n n ( n ) b n ( n ) ) \left(A^{(n)}, b^{(n)}\right)=\left(\begin{array}{llllll} a_{11}^{(1)} & a_{12}^{(1)} & a_{13}^{(1)} & \ldots & a_{1 n}^{(1)} & b_{1}^{(1)} \\ & a_{22}^{(2)} & a_{23}^{(2)} & \ldots & a_{2 n}^{(2)} & b_{2}^{(2)} \\ & & a_{33}^{(3)} & \ldots & a_{3 n}^{(3)} & b_{3}^{(3)} \\ & & & \ddots & \vdots & \vdots \\ & & & & a_{n n}^{(n)} & b_{n}^{(n)} \end{array}\right) (A(n),b(n))=?????????a11(1)??a12(1)?a22(2)??a13(1)?a23(2)?a33(3)??………??a1n(1)?a2n(2)?a3n(3)??ann(n)??b1(1)?b2(2)?b3(3)??bn(n)???????????
这个时候消元完成,然后进行求解,如下:
{
x
n
=
b
n
(
n
)
/
a
n
n
(
n
)
x
i
=
(
b
i
(
i
)
?
∑
j
=
i
+
1
n
a
i
j
(
i
)
x
j
)
/
a
i
i
(
i
)
,
i
=
n
?
1
,
n
?
2
,
?
?
,
1
\left\{\begin{array}{l} x_{n}=b_{n}^{(n)} / a_{n n}^{(n)} \\ x_{i}=\left(b_{i}^{(i)}-\sum_{j=i+1}^{n} a_{i j}^{(i)} x_{j}\right) / a_{i i}^{(i)}, \quad i=n-1, n-2, \cdots, 1 \end{array}\right.
{xn?=bn(n)?/ann(n)?xi?=(bi(i)??∑j=i+1n?aij(i)?xj?)/aii(i)?,i=n?1,n?2,?,1?
matlab代码如下:
function x=gaosi(A,b)
[rows,cols]=size(A);
if rows~=cols
error("rows != cols")
end
n=rows;
Ab=[A,b];
%消元
for i=1:n-1
l= Ab((i+1):end,i)/Ab(i,i);
rep_Ab_row = repmat(Ab(i,:),n-i,1);
Ab((i+1):end,:) = Ab((i+1):end,:)-l.*rep_Ab_row;
end
A=Ab(:,1:n);
b=Ab(:,n+1);
x=zeros(n,1);
x(n)=b(n)/A(n,n);
for i=n-1:-1:1
x(i)=(b(i)-sum(A(i,i+1:end).*(x(i+1:end)')))/A(i,i);
end
关于代码中的l.*rep_Ab_row,l是一个m行1列的系数矩阵,rep_Ab_row是一个m行n+1列的矩阵,这里有点像numpy里的广播机制,前者每一行乘到后者每一行的每个元素上。
比如
>> a
a =
1
2
3
>> b
b =
1 2
3 4
5 6
>> a.*b
ans =
1 2
6 8
15 18
列主元素法
高斯消元法虽然简单,但是要确保消元过程中
a
i
,
i
(
i
)
≠
0
a^{(i)}_{i,i}\neq0
ai,i(i)??=0,因为要作为除数,而且当它比较小的时候,作为除数会导致结果特别大,使得计算过程中的误差变大。
列主元素法就是在每一次消元之前,先对A进行初等行变换,即在这一列中,选取绝对值最大元素所在的行,然后和当前的第一行交换,可以使得误差较小。
%列主元素法
function x=lzys(A,b)
[rows,cols]=size(A);
if rows~=cols
error("rows != cols")
end
n=rows;
Ab=[A,b];
%消元
for i=1:n-1
%先找列主元素
[M,idx] = max(abs(Ab(i:end,i)));
%交换
idx = idx + i-1;%max得到的idx=1时,指的是第i行
Ab([i,idx],:)=Ab([idx,i],:);%去掉这个分号,可以选择列主元素的结果
l= Ab((i+1):end,i)/Ab(i,i);
rep_Ab_row = repmat(Ab(i,:),n-i,1);
Ab((i+1):end,:) = Ab((i+1):end,:)-l.*rep_Ab_row;
end
A=Ab(:,1:n);
b=Ab(:,n+1);
x=zeros(n,1);
x(n)=b(n)/A(n,n);
for i=n-1:-1:1
x(i)=(b(i)-sum(A(i,i+1:end).*(x(i+1:end)')))/A(i,i);
end
内容总结
以上是互联网集市为您收集整理的高斯消元法和列主元素法全部内容,希望文章能够帮你解决高斯消元法和列主元素法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。