📄 gauss_no.cpp
字号:
///////////////////////////////////////////////////////////////
// §7 线性方程组的直接法
//
// 程序7.1 Gauss 消元法 — 不选主元
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#define MAX_n 100 //本程序能处理的方程最大阶数
#define PRECISION 0.0000001 //主元是否小于这个数
//输入m X n 阶阵 到二元数组 A[][] 中
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;}
}
}
//输出 nXm 阶矩阵A中的第k列,因为是输出列,故m不用作为参数传过来
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]);
}
//解n阶上三解方程组,注意最后一列是方程组的右端向量
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];
U[i][n+1]/=U[i][i];
}
return 0;
}
//Gauss不选主元消去法,注意A的第n+1列是方程组的右端向量,1,...,n列是系数矩阵
int GaussElimination(float A[][MAX_n],int n)
{
int i,j,k;
//消元,最后成了上三角方程组
for(i=1;i<n;++i)
{
if(fabs(A[i][i])<PRECISION) return 1; //主元太小,消元失败
for(j=i+1;j<=n;++j)
for(k=i+1;k<=n+1;++k)
A[j][k]-=A[i][k]*A[j][i]/A[i][i];
}
//解下三角方程组
UpTriangle(A,n);
return 0;
}
void main()
{
int n;
float A[MAX_n][MAX_n];
//输入阶数到n
printf("\nInput n=");
scanf("%d",&n);
if(n>=MAX_n-1)
{
printf("\n\007n must <%d!",MAX_n);
exit(0);
}
//输入系数矩阵和右端向量
MatrixInput(A,n,n+1);
//消元
if(GaussElimination(A,n))
printf("\nGauss Failed!"); //失败
else
{
printf("\nOutput Solution:");
MatrixOneColumnOutput(A,n,n+1); //输出解向量
}
printf("\n\n\007Press any key to quit!\n");
getch();
}
/*
运行实例:(注意,输入为方程组的增广矩阵)
Input n=3
===Begin input Matrix elements===
Input_Line 1 : 2 4 -2 6
Input_Line 2 : 1 -1 5 0
Input_Line 3 : 4 1 -2 2
Output Sulution:
x[1]=0.250000
x[2]=1.500000
x[3]=0.250000
Press any key to quit!
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -