Gauss列主元消去法
- 格式:doc
- 大小:109.00 KB
- 文档页数:7
Lab06.Gauss 列主元素消去法实验
【实验目的和要求】
1.使学生深入理解并掌握Gauss 消去法和Gauss 列主元素消去法步骤; 2.通过对Gauss 消去法和Gauss 列主元素消去法的程序设计,以提高学生
程序设计的能力;
3.对具体问题,分别用Gauss 消去法和Gauss 列主元素消去法求解。通过对结果的分析比较,使学生感受Gauss 列主元素消去法优点。 【实验内容】
1.根据Matlab 语言特点,描述Gauss 消去法和Gauss 列主元素消去法步骤。 2.编写用不选主元的直接三角分解法解线性方程组Ax=b 的M 文件。要求输出Ax=b 中矩阵A 及向量b ,A=LU 分解的L 与U ,det A 及解向量x 。 3.编写用Gauss 列主元素消去法解线性方程组Ax=b 的M 文件。要求输出Ax=b 中矩阵A 及向量b 、PA=LU 分解的L 与U 、det A 及解向量x ,交换顺序。
4.给定方程组
(1) ⎥⎥⎥⎦
⎤
⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--11
134.981
.4987
.023.116.427.199.103.601.3321x x x
(2) ⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----15
900001.5820
1
2
151********.2310710
4321x x x x 先用编写的程序计算,再将(1)中的系数3.01改为3.00,0.987改为0.990;将(2)中的系数2.099999改为2.1,5.900001改为9.5,再用Gauss 列主元素消去法解,并将两次计算的结果进行比较。
高斯列主元消去法
2.3高斯列主元消去法解线性方程组
一:问题的提出
我们都知道,高斯列主元素消去法是计算机上常用来求解线性方程组的一种直接的方法。就是在不考虑舍入误差的情况下,经过有限步的四则运算可以得到线性方程组的准确解的一类方法。实际运算的时候因为只能有限小数去计算,因此只能得到近似值。在实际运算的时候,我们很多时候也常用高斯消去法。但是高斯消去法在计算机中运算的时候常会碰到两个问题。
1.一旦遇到一些主元等于0,消元过程便无法进行下去。
2.在长期使用中还发现,即使消元过程能进行下去,但是当一些主元的绝对值很小时,求解出的结果与真实结果相差甚远。
为了避免高斯消去法消元过程中出现的上述两个问题,一般采用所谓的选择主元法。其中又可以分为列选主元和全面选主元两种方法。目前计算机上常用的按列选主元的方法。因此我在这里做的也是列选主元高斯消去法。
二、算法的基本思想
大家知道,如果一个线性方程组的系数矩阵是上三角矩阵时,即这种方程组我们称之为上三角方程组,它是很容易求解的。我们只要把方程组的最下面的一个方程求解出来,在把求得的解带入倒数第二个方程,求出第二个解,依次往上回代求解。然而,现实中大多数线性方程组都不是上面所说的上三角方程组,所以我们有可以把不是上三角的方程通过一定的
算法化成上三角方程组,由此我们可以很方便地求出方程组的解。高斯消元法的目的就是把一般线性方程组简化成上三角方程组。于是高斯消元法的基本思想是:通过逐次消元将所给的线性方程组化为上三角形方程组,继而通过回代过程求解线性方程组。
Guass列选主元消去法和三⾓分解法 最近数值计算学了Guass列主消元法和三⾓分解法解线性⽅程组,具体原理如下:
1、Guass列选主元消去法对于AX =B
1)、消元过程:将(A|B)进⾏变换为,其中是上三⾓矩阵。即:
k从1到n-1
a、列选主元
选取第k列中绝对值最⼤元素作为主元。
b、换⾏
c、归⼀化
d、消元
2)、回代过程:由解出。
2、三⾓分解法(Doolittle分解)
将A分解为如下形式
由矩阵乘法原理
a、计算U的第⼀⾏,再计算L的第⼀列
b、设已求出U的1⾄r-1⾏,L的1⾄r-1列。先计算U的第r⾏,再计算L的第r列。
a)计算U的r⾏
b)计算L的r列
C#代码:
代码说明:Guass列主消元法部分将计算出来的根仍然储存在增⼴矩阵的最后⼀列,⽽Doolittle分解,将分解后的结果也储存⾄原来的数组中,这样可以节约空间。。
using System;
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Cannel_Button_Click(object sender, EventArgs e)
{
this.textBox1.Clear();
this.textBox2.Clear();
this.textBox3.Clear();
boBox1.SelectedIndex = -1;
}
public double[,] GetNum(string str, int n)
计算方法实验报告1
课题名称
用列主元高斯消去法和列主元三角分解法解线性方程
目的和意义
高斯消去法是一个古老的求解线性方程组的方法,但由它改进得到的选主元的高斯消去法则是目前计算机上常用的解低阶稠密矩阵方程组的有效方法;
用高斯消去法解线性方程组的基本思想时用矩阵行的初等变换将系数矩阵A 约化为具有简单形式的矩阵上三角矩阵、单位矩阵等,而三角形方程组则可以直接回带求解 用高斯消去法解线性方程组b Ax =其中A ∈Rn ×n 的计算量为:乘除法运算步骤为
32(1)(1)(21)(1)(1)262233n n n n n n n n n n n
MD n ----+=
+++=+-,加减运算步骤为
(1)(21)(1)(1)(1)(25)
6226n n n n n n n n n n AS -----+=
++=
;相比之下,传统的克莱姆法
则则较为繁琐,如求解20阶线性方程组,克莱姆法则大约要19
510⨯次乘法,而用高斯消去法只需要3060次乘除法;
在高斯消去法运算的过程中,如果出现absAi,i 等于零或过小的情况,则会导致矩阵元素数量级严重增长和舍入误差的扩散,使得最后的计算结果不可靠,所以目前计算机上常用的解低阶稠密矩阵方程的快速有效的方法时列主元高斯消去法,从而使计算结果更加精确; 2、列主元三角分解法
高斯消去法的消去过程,实质上是将A 分解为两个三角矩阵的乘积A=LU,并求解Ly=b 的过程;回带过程就是求解上三角方程组Ux=y;所以在实际的运算中,矩阵L 和U 可以直接计算出,而不需要任何中间步骤,从而在计算过程中将高斯消去法的步骤进行了进一步的简略,大大提高了运算速度,这就是三角分解法
Guass列主元消去法
(已验证过,保证可用正确)function y=Guass(A,b)
n=length(A);
u=zeros(1,n);
for k=1:n-1
p=find(abs(A(k:n,k))==max(abs(A(k:n,k))));%
p(1)=p(1)+k-1;
u(k)=p(1);
dd=A(p(1),1:n); % 中间变量
A(p(1),1:n)=A(k,1:n);
A(k,1:n)=dd;
if A(k,k)~=0
A(k+1:n,k)=A(k+1:n,k)/A(k,k);
A(k+1:n,k+1:n)=A(k+1:n,k+1:n)-A(k+1:n,k)*A(k,k+1:n);
else
stop % 矩阵奇异
end
end
%--------------------
U=zeros(n);
for i=1:n
for j=i:n
U(i,j)=A(i,j);
end
end
L=A-U;
for i=1:n
L(i,i)=1;
end
P=eye(n);
for i=1:n-1
dd=P(i,:); % 中间变量
P(i,:)=P(u(i),:);
P(u(i),:)=dd;
end
[n,m]=size(L);
b1=P*b;
for j=1:n-1
b1(j)=b1(j)/L(j,j);
b1(j+1:n)=b1(j+1:n)-b1(j)*L(j+1:n,j);
end
b1(n)=b1(n)/L(n,n);
[m,n]=size(U);
y=b1;
for j=n:-1:2
y(j)=y(j)/U(j,j);
y(1:j-1)=y(1:j-1)-y(j)*U(1:j-1,j);
Matlab计算程序
function[x,det,flag]=Gauss(A,b)
% 求线性方程组的列主元Gauss消去法,其中,
% A为方程组的系数矩阵;
% b为方程组的右端项;
% x为方程组的解;
% det为系数矩阵A的行列式的值;
% flag为指标向量,flag='failure'表示计算失败,flag='OK'表示计算成功。!
[n,m]=size(A); nb=length(b);
% 当方程组行与列的维数不相等时,停止计算,并输出出错信息。
if n~=m
error('The rows and columns of matrix A must be equal!');
return;
end
% 当方程组与右端项的维数不匹配时,停止计算,并输出出错信息
if m~=nb
:
error('The columns of A must be equal the length of b!')
return;
end
% 开始计算,先赋初值
flag='OK';det=1;x=zeros(n,1);
for k =1:n-1
% 选主元
max1=0;
)
for i =k:n
if abs(A(i,k))> max1
max1=abs(A(i,k));r=i;
end
end
if max1<1e-10
flag='failure';return;
end
^
% 交换两行
if r>k
for j =k:n
z=A(k,j);A(k,j)=A(r,j);A(r,j)=z; end
z=b(k);b(k)=b(r);b(r)=z; det=-det;
例:用Gauss 列主元消去法、QR 方法求解如下方程组:
12342212141
312.4201123230x x x x ⎛⎫⎛⎫⎛⎫ ⎪ ⎪ ⎪- ⎪ ⎪ ⎪= ⎪ ⎪ ⎪-- ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭
1. 1)Gauss 列主元法源程序:
function x=Gauss(A,b)
[m,n]=size(A);
if m~=n
error('矩阵不是方阵')
return
end
B=[A,b];
n=length(A);
for j=1:n-1
q=[zeros(j-1,1);B(j:n,j)];
[c,r]=max(abs(q)); %c 为列主元,r 为所在行
if r~=j
temp=B(j,:); %交换两行
B(j,:)=B(r,:);
B(r,:)=temp;
end
for i=j+1:n
B(i,:)=B(i,:)-B(j,:)*(B(i,j)/c);
end
end
x(n)=B(n,n+1)/B(n,n);
for i=n-1:-1:1
for j=i:n-1
B(i,n+1)=B(i,n+1)-B(i,j+1)*x(j+1);
end
x(i)=B(i,n+1)/B(i,i);
end
2)在命令窗口输入A ,b,得到x 的近似解:
>> A=[2,2,1,2;4,1,3,-1;-4,-2,0,1;2,3,2,3];
>> b=[1;2;1;0];
>> x=Gauss(A,b)
1.5417
-2.7500
0.0833
1.6667
2. 1)QR方法源程序:
function [Q,R,X]=qrfj(A,b)
[m,n]=size(A);
高斯列主元素消去法是一种解线性方程组的常用方法,特别在数值分
析和线性代数中应用广泛。在Matlab中,我们可以使用该方法来解
决大规模的线性方程组,包括矩阵的求解和矩阵的反转。
一、高斯列主元素消去法的基本原理
高斯列主元素消去法是一种基于矩阵消元的方法,它通过一系列的矩
阵变换将原始的线性方程组转化为上三角形式,然后再进行回代求解。这个方法的核心就是通过矩阵的变换来简化原始的线性方程组,使得
求解过程更加简单高效。
在Matlab中,我们可以利用矩阵运算和函数来实现高斯列主元素消
去法,如`lu`分解函数和`\"`运算符等。通过这些工具,我们能够快速
地求解各种规模的线性方程组并得到准确的结果。
二、高斯列主元素消去法在Matlab中的实现
在Matlab中,我们可以通过调用`lu`函数来实现高斯列主元素消去法。该函数返回一个上三角矩阵U和一个置换矩阵P,使得PA=LU。通过对U进行回代求解,我们可以得到线性方程组的解。
除了`lu`函数之外,Matlab还提供了一些其他的函数和工具来帮助我
们实现高斯列主元素消去法,比如`\"`运算符和`inv`函数等。通过这些工具的组合使用,我们能够更加灵活地进行线性方程组的求解,并且
可以方便地处理特殊情况和边界条件。
三、高斯列主元素消去法的应用与局限性
高斯列主元素消去法在实际应用中具有广泛的适用性,特别是对于大
规模的线性方程组或者稀疏矩阵的求解。通过Matlab中的工具和函数,我们可以快速地求解各种规模的线性方程组,并得到高精度的数
值解。
然而,高斯列主元素消去法也存在一些局限性,比如对于奇异矩阵或
线性方程组的解法——Gauss 列主元素法
给定线性方程组b Ax =,设()⎪⎪⎪⎪
⎪⎭
⎫
⎝⎛=n nn
n n n n b a a a b a a a b a a a b A
2
1
222221
111211, (1) 列主元高斯消元法的具体过程如下:
第一步:首先在增广矩阵式(1)下的第一列选取绝对值最大的元,比如为11
i a ,则
111max 1i n
i i a a ≤≤=,将式(1)中第一行与第1i 行互换。为方便起见,记行互换后的增广矩阵为
()()()1
1
,b A ,然后进行第一次消元,得矩阵
()
()
()
()
()
()
()()
()
()()
()
()⎪⎪⎪⎪
⎪⎭
⎫
⎝
⎛=2222221111222
2222
111211,n nn
n n n
b a a b a a b a a a b
A
第k 步:在矩阵()()()k k b A ,的第k 列中选主元,如k k
k i a ,使()
k ik n
i k k
a a k k
i ≤≤=max ,若存在多个k i ,
则取其中的最小者,若绝对值最大元素0=k k
k i a ,则矩阵A 奇异,方程组无解,停止计算;
否则,将()()()k k b A ,的第k 行与第k i 行互换,进行第k 次消元。
如此经过n-1步,增广矩阵(1)被化成上三角形,最后由回代过程求解。
例1 用列主元素求解线性方程组⎪⎩
⎪
⎨⎧-=-+-=+-=++15
3181533126321321321x x x x x x x x x ,计算过程保留三位小数。
解:按列主元素法,求解过程如下: ⎪⎪⎪⎭
1、用Guass列选主元消去法求解方程组源程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAX_n 100
#define PRECISION 0.0000001
void MatrixInput(float A[][MAX_n],int m,int n)//输入数组
{
int i,j;float ftmp;
printf("\n===Begin input Matrix elements===\n");
for(i=1;i<=m;++i)
{
printf("Input_Line %d : ",i);
for(j=1;j<=n;++j)
{
scanf("%f",&ftmp);
A[i][j]=ftmp;
}
}
}
void MatrixOneColumnOutput(float A[][MAX_n],int n,int k)//输出方程的解{
int i;
for(i=1;i<=n;++i)
printf("\nx[%d]=%f",i,A[i][k]);
}
int UpTriangle(float U[][MAX_n],int n)//解上三角方程组
{
int i,j;
for(i=n;i>0;--i)
{
if(fabs(U[i][i])<PRECISION)
return 1;
for(j=i+1;j<=n;++j)
U[i][n+1]-=U[i][j]*U[j][n+1];
列主元高斯消去法简介
【示例范文仅供参考】
---------------------------------------------------------------------- 列主元素消去法是为控制舍入误差而提出来的一种算法,列主元素消去法计算基本上能控制舍入误差的影响。
其基本思想是:在进行第k(k=1,2,...,n-1)步消元时,从第k列的akk 及其以下的各元素中选取绝对值最大的元素,然后通过行变换将它交换到主元素akk的位置上,再进行消元。
列主元消去法仅需矩阵行的交换,因此不发生未知数排列次序的调换。而全主元消去法则要花费相当多的时间选取主元,且还需记录系数矩阵列交换信息。
其原理是在高斯消去法的消元过程中第k步要求除以akk,为了防止除数为零或除数太小造成的误差过大的问题,在消元开始是先将该列最大元(绝对值)所在行移到消元第一行在除akk,然后消元。
列主元消去法虽然和高斯消去法原理一样,但是列主元消去法可以减小舍入误差,精度比较高,是解决小型稠密矩阵的一个较好的算法。而高斯消去法虽然编程简单,但是计算量大,而且对于两个相近的解时由于舍入误差的存在,使得结果误差很大。
列主元的高斯消去法
利用列主元的高斯消去法matlab程序源代码:
首先建立一个gaussMethod.m的文件,用来实现列主元的消去方法。
function x=gaussMethod(A,b)
%高斯列主元消去法,要求系数矩阵非奇异的,%
n = size(A,1);
if abs(det(A))<= 1e-8
error('系数矩阵是奇异的');
return;
end
%
for k=1:n
ak = max(abs(A(k:n,k)));
index = find(A(:,k)==ak);
if length(index) == 0
index = find(A(:,k)==-ak);
end
%交换列主元
temp = A(index,:);
A(index,:) = A(k,:);
A(k,:) = temp;
temp = b(index);b(index) = b(k); b(k) = temp;
%消元过程
for i=k+1:n
m=A(i,k)/A(k,k);
%消除列元素
A(i,k+1:n)=A(i,k+1:n)-m*A(k,k+1:n);
b(i)=b(i)-m*b(k);
end
end
%回代过程
x(n)=b(n)/A(n,n);
for k=n-1:-1:1;
x(k)=(b(k)-A(k,k+1:n)*x(k+1:n)')/A(k,k);
end
x=x';
end
然后调用gaussMethod函数,来实现列主元的高斯消去法。在命令框中输入下列命令:
输出结果如下:
数值试验报告分析
一、实验名称:解线性方程组的列主元素高斯消去法和LU 分解法
二、实验目的及要求:
通过数值实验,从中体会解线性方程组选主元的必要性和LU分解法的优点,以及方程组
系数矩阵和右端向量的微小变化对解向量的影响。
三、算法描述:
本次试验采用的是高斯列主元消去法和LU分解法求解线性方程组的解。
其中,高斯消去法的基本思想是避免接近于零的数作分母;能进行到底的条件: 当A可逆时,列主元Gauss(高斯)消去法一定能进行到底。
优点: 具有很好的数值稳定性;具有与顺序Gauss 消去法相同的计算量。列主元Gauss(高斯)消去法的精度显著高于顺序Gauss(高斯)消去法。
注意:省去换列的步骤,每次仅选一列中最大的元。
矩阵的三角分解法是A=LU,L 是下三角阵,U是上三角阵,Doolittle 分解:L 是单位下三角阵,U是上三角阵;Crout 分解:L 是下三角阵,U是单位上三角阵。矩阵三角分解的条件是矩阵 A 有唯一的Doolittle 分解的充要条件是 A 的前n-1 顺序主子式非零;矩阵A有唯一的Crout 分解的充要条件是 A 的前n-1 顺序主子式非零。三角分解的实现是通过(1)Doolittle 分解的实现;(2)Doolittle 分解的缺点:条件苛刻,且不具有数值稳定性。(3)用Doolittle 分解求解方程组: AX=b LUX=b LY=b
A=LU UX=Y ;
四、实验内容:
解下列两个线性方程组
3.01 6.03 1.99 x1 1
1) 1.27 4.16 1.23 x2 1
《数值分析》实验报告
实验编号:实验二
课题名称:列主元Gauss消去法
一、算法介绍
1、输入矩阵的阶数n,方程组的增广矩阵A;
2、对k=0,1,…,n-2,循环:选取列中绝对值最大的元素,将主元所在的行的元素保存在
数组temp[n+1]中。若主元为零,则系数矩阵奇异,计算停止;否则,顺序进行。如果绝对值最大的元素就在矩阵的对角线上,则进行普通高斯消元法的第一大步,否则将方程组系数换行之后再进行普通高斯消元法的第一大步;
3、然后利用回代法求解线性方程组。
二、程序代码
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
int n=0,k=0,i=0,j=0,h=0,g=0,flag=0,i1,j1;
double max=0,m=0;
cout<<"***利用列主元Gauss消元法求解线性方程组***"<<endl;
cout<<"请输入矩阵的阶数:"<<endl;
cin>>n;
double a[n][n+1];
double t[n+1];
double x[n];
memset(a,0,sizeof(a));
memset(x,0,sizeof(x));
cout<<"请输入方程组的增广矩阵:"<<endl;
for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++)