实验一 列主元消去法
【实验内容】1. 掌握列主元消去法的基本思路和迭代步骤
2. 并能够利用列主元的高斯消去法解任意阶数的线性方程组;
【实验方法与步骤】列主元消去法编写程序
1.列主元消去法基本思路
设有线性方程组Ax b =,设A 是可逆矩阵。
列主元消去法的基本思想就是通过列主元的选取将初等行变换作用于方程组的增广矩阵[]|B A b =,将其中的A 变换成一个上三角矩阵,然后求解这个三角形方程组。
2.列主元高斯消去法算法描述
将方程组用增广矩阵[]()(1)|ij n n B A b a ⨯+==表示。
步骤1:消元过程,对1,2,,1k n =-
(1) 选主元,找{},1,,k i k k n ∈+使得
,max k i k ik k i n
a a ≤≤= (2) 如果,0k i k a =,则矩阵A 奇异,程序结束;否则执行(3);
(3) 如果k i k ≠,则交换第k 行与第k i 行对应元素位置,k kj i j a a ↔,
,,1j k n =+;
(4) 消元,对,,i k n =,计算/,ik ik kk l a a =对1,
,1j k n =++,计算
.ij ij ik kj a a l a =- 步骤 2:回代过程:
(1) 若0,nn a =则矩阵奇异,程序结束;否则执行(2);
(2) ,1/;n n n nn x a a +=对1,
,2,1i n =-,计算
,11/n i i n ij j ii j i x a a x a +=+⎛⎫=- ⎪⎝⎭∑
习题3第一题程序如下
#include <stdio.h>
#include <math.h>
#define N 3
int I;
float max_value(float a[N][N+1],int n,int k) { float max;
int i;
max=a[k][k];
for(i=k+1;i<n;i++)
if(max<a[i][k])
{
max=a[i][k];
I=i;
}
return(max);
}
void change(float *p,float *q)
{
float temp;
temp=*p; *p=*q; *q=temp;
return;
}
main()
{float a[N][N+1]={{2,2,3,3},{4,7,7,1},{-2,4,5,-7}}; float x[N],max,m,*c,*d;
int k=0,q=0,n=N,i,j;
for(k=0;k<n && q==0;k++)
{
max=max_value(a,n,k);
if(max==0) q=1;
else
{ if(I!=k)
{
for(j=k;j<n+1;j++)
{
c=&a[I][j];
d=&a[k][j];
change(c,d);
}
}
for(i=k+1;i<n;i++)
{
m=a[i][k]/a[k][k];
for(j=0;j<n+1;j++)
a[i][j]=a[i][j]-a[k][j]*m;
}
}
}
for(i=n-1;i>=0;i--)
{
for(j=i+1;j<n;j++)
a[i][3]=a[i][3]-a[i][j]*x[j];
x[i]=a[i][3]/a[i][i];
}
printf("得到的结果如下:\n");
for(i=0;i<n;i++)
printf(" x[%d]=% 6.4f\n",i+1,x[i]); }
【实验结果】
经检验运行结果正确。