数值分析c语言实现高斯赛德尔解法
数值分析
程
序
设
计
学院:计算机学院
姓名:袁薪洋
实验目的:
1熟练掌握C语言程序设计,编程求解问题。
2.运用高斯-赛德尔迭代公式求解线性方程组。
实验内容:
用高斯-赛德尔迭代公式求解方程组。
10x1-x2-2x3=7.2
-x1+10x2-2x3=8.3
-x1-x2+5x3=4.2
程序的核心代码:
#include"math.h"
#include
#define NUMBER 20
float A[NUMBER][NUMBER+1] ;
float ark;
int flag,n;
void exchange(int r,int k);
float max(int k);
void main()
{
float x[NUMBER]; /*此数组用于存放方程解*/
int r,k,i,j;
printf("***********************************");
printf("\n\n用高斯-赛德尔迭代法解线性方程组\n\n");
printf("***********************************");
printf("\n\n 请输入方程组的维数:n=");
scanf("%d",&n);
printf(" \n\n请输入系数矩阵A和向量b:");
for(i=1;i<=n;i++)
{
printf("\n\n请输入a%d1--a%d%d系数和向量b%d(数之间用空格格开):",i,i,n,i);
//实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定
for(j=1;j<=n+1;j++) //将刚才输入的数存入数组
scanf("%f",&A[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=max(k);
if(ark==0) //判断方程是否为线性方程
{
printf("\n\n此方程组不合法!");
}
else if(flag!=k)
exchange(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
}
x[n]=A[n][n+1]/A[n][n];
for( k=n-1;k>=1;k--)
{
float me=0;
for(j=k+1;j<=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i<=n;i++)
{
printf(" \n\nx%d=%f",i,x[i]);
}
}
void exchange(int r,int k) //交换行的矩函数
{
int i;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
A[k][i]=A[0][i];
}
float max(int k) //比校系数大小的函数
{
int i;
float temp=0;
for(i=k;i<=n;i++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k]);
flag=i;
}
return temp;
}
运行结果:
截图如下: