列主元消去法例题详解_列主元消去法解方程组实验报告..doc

该实验报告详细介绍了列主元消去法解线性方程组的过程,包括算法原理、流程图和MATLAB实现。通过列主元选择和行交换,确保计算过程中减少舍入误差,提高解的可靠性。实验目标是编写.m文件,使用列主元消去法求解方程组并输出解、L和U矩阵以及主行信息。
摘要由CSDN通过智能技术生成

列主元消去法解方程组实验报告.

实验名称: 列主元消去法解方程组

引言

我们知道,高斯消去法是一个古老的解线性方程组的方法。而在用高斯消去法解Ax=b时,其中设A为非奇异矩阵,可能出现的情况,这时必须进行带行交换的高斯消去法。但在实际计算中即使但其绝对值很小时,用作除数,会导致中间结果矩阵元素数量级严重增长和舍入误差的扩散,使得最后的结果不可靠。因此,小主元可能导致计算的失败,我们应该避免采用绝对值很小的主元素。为此,我们在高斯消去法的每一步应该在系数矩阵或消元后的低阶矩阵中选取绝对值最大的元素作为主元素,保持乘数,以便减少计算过程中舍入误差对计算解的影响。

一种方式是完全主元消去法,这种消去法是在每次选主元时,选择为主元素。这种方法是解低阶稠密矩阵方程组的有效方法,但这种方法在选取主元时要花费一定的计算机时间。实际计算中我们常采用部分选主元的的消去法。列主元消去法即在每次选主元时,仅依次按列选取绝对值最大的元素作为主元素,且仅交换两行,再进行消元计算。

实验目的和要求

运用matlab编写一个.m文件,要求用列主元消去法求解方程组(实现PA=LU):

要求输出以下内容:

计算解x;

L,U;

整形数组IP(i)(i=1,2,…,n-1)(记录主行信息)

算法原理与流程图

算法原理

设有线性方程组Ax=b,其中设A为非奇异矩阵。方程组的增广矩阵为

第1步(k=1):首先在A的第一列中选取绝对值最大的元素,作为第一步的主元素: ,然后交换(A,b)的第1行与第i1行元素,再进行消元计算。

设列主元素消去法已经完成第1步到第k-1步的按列选主元,交换两行,消元计算得到与原方程组等价的方程组

第k步计算如下:

对于k=1,2,…,n-1

(1)按列选主元:即确定ik使

(2)如果,则A为非奇异矩阵,停止计算。

(3)如果ik≠k,则交换[A,b]第ik行与第k行元素。

(4)消元计算

消元乘数满足:

(5)回代求解

计算解在常数项b(n)内得到。

流程图见图1

程序代码及注释

%列主元消去法解方程组Ax=b,实现PA=LU

function [x,L,U,IP,P] =gauss(A,b)

%x为方程组的解,IP用来记录行信息

%每次选列主元时,将A的第k行与第IP(k)行进行交换

n=length(b);[p,q]=size(A);

%当输入的系数矩阵不为方阵,或方阵维数与b不符时,报错

if p~=q||p~=n

fprintf('Error! Please input again!');

end

%为提高运行速度,给IP,P,L,U赋初值

IP=zeros(1,n-1);

L=zeros(n,n);

U=zeros(n,n);

P=eye(n);

x=zeros(1,n);

det=1.0;

%按列选主元,并进行行交换,记录行信息

for k=1:n-1

IP(k)=k;

for m=k+1:n

if abs(A(m,k))>abs(A(k,k))

IP(k)=m;

end

end

I=eye(n);

if IP(k)~=k

for i=1:n

p(i)=I(k,i);

I(k,i)=I(IP(k),i);

I(IP(k),i)=p(i);

end

A=I*A;

b=I*b';

b=b';

end

%进行消元计算

for i=k+1:n

A(i,k)=A(i,k)/A(k,k);

b(i)=b(i)-A(i,k)*b(k);

for j=k+1:n

A(i,j)=A(i,j)-A(i,k)*A(k,j);

end

det=det*A(k,k);

P=I*P;

end

%回代求解

x(n)=b(n)/A(n,n);

for i=n-1:-1:1

sum=0.0;

for j=i+1:n

sum=sum+A(i,j)*x(j);

end

x(i)=(b(i)-sum)/A(i,i);

end

det=det*A(n,n);

if det==0

fprintf('The equations have no unique solution!');

end

%输出PA=LU中的L,U的信息

for i=1:n

#include<stdio.h> #include<math.h> #define N 100 #define epsilon 1e-6 float a[N][N+1]; void menu( ) { printf("\t\t%c%c%c^_^Gauss列主元消去法求解线性方程组^_^%c%c%c\n\n",1,1,1,1,1,1); printf("强烈建议您先阅读以下几点后在运行:\n"); printf("1.这是用Gauus列主元消去法求解线性方程组的应用程序\n"); printf(" (Gauus全主元消去法类似可做,读者有兴趣的话可自行而做)\n"); printf("2.请您先了Gauus列主元消去法的主要思想\n"); } void main( ) { int i,j,k,n; float t,s=0; char choice; menu( ); loop: printf("\n请输入系数方阵的阶数:"); scanf("%d",&n); while(n>0) { printf("\n"); printf("请输入增广阵矩:\n"); for(i=0;i<n;i++) for(j=0;j<n+1;j++) scanf("%f",&a[i][j]);/*存储增广阵矩*/ for(k=0;k<n-1;k++) { for(i=k+1;i<n;i++)/*求出每列中最大数,后行交换*/ if( fabs(a[i][k]) > fabs(a[k][k]) ) for(j=k;j<n+1;j++) { t=a[k][j]; a[k][j]=a[i][j]; a[i][j]=t; } if( fabs(a[k][k]) < epsilon)/*最大数小于很小数时退出*/ { printf("\n错误,Gauss列主元消去法无法忍受,在%d步退出!\n",k+1); printf("还要再计算其他的么(Y/N)?"); scanf("%c",&choice); if(choice=='Y' || choice=='y')/*判断用户输入*/ goto loop; else return; } for(i=k+1;i<n;i++) { a[i][k]=a[i][k] / a[k][k]; for(j=k+1;j<n+1;j++) a[i][j]=a[i][j]-a[i][k] * a[k][j]; } } a[n-1][n]=a[n-1][n] / a[n-1][n-1]; for(k=n-2;k>=0;k--) { s=0; for(j=k+1;j<n;j++) s+=a[k][j]*a[j][n]; a[k][n]=( a[k][n]-s ) / a[k][k]; } printf("\n*****运行结果*****\n"); for(i=0;i<n;i++) printf(" x[%d]=%.4f\n",i+1,a[i][n]); printf(" 谢谢使用!\n"); printf("还要再计算其他的么(Y/N)?"); getchar( ); scanf("%c",&choice); if(choice=='Y' || choice=='y')/*判断用户输入*/ goto loop; else return; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值