📄 gauss比例消去法解线性方程组.txt
字号:
#include <stdio.h>
#include <malloc.h>
#include <math.h>
int Gausscale(int n,float *matrix,float esp)
{
float m,p,sum,*temp,*x,*max;
int i,j,k,s,add; //i,j,k,s为数组坐标和循环变量
temp=(float *)malloc((n+1)*sizeof(float)); //交换行时使用的中间数组
x=(float *)malloc(n*sizeof(float)); //存放x值
max=(float *)malloc(n*sizeof(float)); //存放每行最大值
for(i=0;i<n;i++) //总循环
{
for(j=0;j<n;j++) //求每行最大元放入max数组
for(k=1;k<n;k++)
{
p=fabs(matrix[j*(n+1)+0]);
if(p<fabs(matrix[j*(n+1)+k])) p=fabs(matrix[j*(n+1)+k]);
max[j]=p;
}
for(k=0;k<n;k++) //若max为0,返回
if(max[k]<=esp)
{
free(temp);
free(x);
free(max);
return 1;
}
s=i;
p=fabs(matrix[i*(n+1)+i]/max[i]);
for(j=i+1;j<n;j++)
{
if(p<fabs(matrix[j*(n+1)+i]/max[j]))
{
p=fabs(matrix[j*(n+1)+i]/max[j]);
s=j;
}
}
if(s!=i)
for(k=0;k<=n;k++)
{
temp[k]=matrix[s*(n+1)+k];
matrix[s*(n+1)+k]=matrix[i*(n+1)+k];
matrix[i*(n+1)+k]=temp[k];
}
if(fabs(matrix[i*(n+1)+i])<=esp) //判0
{
free(temp);
free(x);
free(max);
if(i==n-1) return 0;
else return 1;
}
for(j=i+1;j<n;j++) //消去过程
{
m=matrix[j*(n+1)+i]/matrix[i*(n+1)+i];
for(k=0;k<=n;k++)
matrix[j*(n+1)+k]-=m*matrix[i*(n+1)+k];
}
} //总循环结束
printf("\nThe changed matrix is:\n\n"); //输出经变换后的矩阵
for(i=0;i<n;i++)
for(j=0;j<=n;j++)
{
printf("%f ",matrix[i*(n+1)+j]);
if(j==n) printf("\n");
}
printf("\n");
for(k=n-1;k>=0;k--) //求未知数x
{
sum=matrix[k*(n+1)+n];
for(add=1;k+add<n;add++)
sum-=matrix[k*(n+1)+k+add]*x[k+add];
x[k]=sum/matrix[k*(n+1)+k];
}
printf("\nThe results of the equation are:\n\n"); //输出结果
for(i=0;i<n;i++)
printf("x%d=%f\n",i,x[i]);
free(temp);
free(x);
free(max);
return 2;
} //Gausscale
void main()
{
float *matrix,esp;
int i,n,sign;
printf("Please input the number of vars of the equation: ");
scanf("%d",&n); //输入未知数个数
matrix=(float *)malloc(n*(n+1)*sizeof(float)); //创建矩阵
printf("\nPlease input the matrix:\n");
for(i=0;i<n*(n+1);i++)
scanf("%f",&matrix[i]); //输入矩阵
printf("\nPlease input the precision:\n");
scanf("%f",&esp); //输入精度
sign=Gausscale(n,matrix,esp);
switch(sign) //根据返回值的不同,输出不同的信息
{
case 0:printf("\nThere is no only result!\n\n");break;
case 1:printf("\nIt's a invalid equation!\n\n");break;
case 2:printf("\nThe results are printed!\n\n");
}
free(matrix);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -