#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define NUMBER 20
#define Esc 0x1b
#define Enter 0x0d
float A[NUMBER][NUMBER+1] ,ark
int flag,n
void exchange(int r,int k)
float max(int k)
void message()
int main()
{
float x[NUMBER] /*此数组用于存放方程解*/
int k,i,j
char celect
system("cls")
printf("\n用Gauss列主元消元法解线性方程组")
printf("\n1.解方程组请按Enter.")
printf("\n2.退出程式请按Esc.")
celect=getch()
if(celect==Esc)
exit(0)
printf("\n 输入方程组的维数:n=")
scanf("%d",&n)
for(i=1i<=ni++)
{
printf("\n请输入a%d1--a%d%d系数和向量b%d: \n",i,i,n,i)
/*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/
for(j=1j<=n+1j++) /*将刚才输入的数存入数组*/
scanf("%f",&A[i][j])
}
for(k=1k<=n-1k++)
{
ark=max(k)
if(ark==0)/*判断方程是否为线性方程,即是否合法*/
{
printf("\n此方程组不合法!")message()
}
else if(flag!=k)
exchange(flag,k)
for(i=k+1i<=ni++)
for(j=k+1j<=n+1j++)
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-1k>=1k--)
{
float me=0
for(j=k+1j<=nj++)
{
me=me+A[k][j]*x[j]
}
x[k]=(A[k][n+1]-me)/A[k][k]
}
for(i=1i<=ni++)
{
printf("\nx%d=%f",i,x[i])
}
message()
getch()
return 1
}
void exchange(int r,int k) /*交换行的矩函数*/
{
int i
for(i=1i<=n+1i++)
A[0][i]=A[r][i]
for(i=1i<=n+1i++)
A[r][i]=A[k][i]
for(i=1i<=n+1i++)
A[k][i]=A[0][i]
}
float max(int k) /*比校系数大小的函数*/
{
int i
float temp=0
for(i=ki<=ni++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k])
flag=i
}
return temp
}
void message() /*实现菜单选择的函数*/
{
printf("\n 继续运算按 Enter ,退出程式按 Esc!")
switch(getch())
{
case Enter: main()
case Esc: exit(0)
default:{printf("\n不合法的输入!")message()}
}
}
#include "stdlib.h"#include "math.h"
#include "stdio.h"
int rgauss(n,a,b)
int n
double a[],b[]
{ int *js,l,k,i,j,is,p,q
double d,t
js=malloc(n*sizeof(int))
l=1
for (k=0k<=n-2k++)
{ d=0.0
for (i=ki<=n-1i++)
for (j=kj<=n-1j++)
{ t=fabs(a[i*n+j])
if (t>d) { d=tjs[k]=jis=i}
}
if (d+1.0==1.0) l=0
else
{ if (js[k]!=k)
for (i=0i<=n-1i++)
{ p=i*n+kq=i*n+js[k]
t=a[p]a[p]=a[q]a[q]=t
}
if (is!=k)
{ for (j=kj<=n-1j++)
{ p=k*n+jq=is*n+j
t=a[p]a[p]=a[q]a[q]=t
}
t=b[k]b[k]=b[is]b[is]=t
}
}
if (l==0)
{ free(js)printf("fail\n")
return(0)
}
d=a[k*n+k]
for (j=k+1j<=n-1j++)
{ p=k*n+ja[p]=a[p]/d}
b[k]=b[k]/d
for (i=k+1i<=n-1i++)
{ for (j=k+1j<=n-1j++)
{ p=i*n+j
a[p]=a[p]-a[i*n+k]*a[k*n+j]
}
b[i]=b[i]-a[i*n+k]*b[k]
}
}
d=a[(n-1)*n+n-1]
if (fabs(d)+1.0==1.0)
{ free(js)printf("fail\n")
return(0)
}
b[n-1]=b[n-1]/d
for (i=n-2i>=0i--)
{ t=0.0
for (j=i+1j<=n-1j++)
t=t+a[i*n+j]*b[j]
b[i]=b[i]-t
}
js[n-1]=n-1
for (k=n-1k>=0k--)
if (js[k]!=k)
{ t=b[k]b[k]=b[js[k]]b[js[k]]=t}
free(js)
return(1)
}
徐世良老师的.原地工作全选主元的高斯消元.用的符号有点诡异,而且将矩阵以线性表输入的.
我也写过一个,不过估计你不太喜欢用我的,这个用来解b也是矩阵的.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void swap(double *a,double *b){
double temp
temp=*a
*a=*b
*b=temp
}
void printMatrix(int n,int m,double **a){
int i,j
for (i=0i<ni++){
for (j=0j<mj++) printf("%e\t",a[i][j])
printf("\n")
}
}
int rgauss(int n,int m,double **a,double **b){//,double *det){
int *colex,rowex,s,i,j,k
double d,t
// *det=1
s=0
colex=malloc(n*sizeof(int))
for (k=0k<nk++){
d=0.0
for (i=ki<ni++){
for (j=kj<nj++){
t=fabs(a[i][j])
if (t>d){
d=t
colex[k]=j
rowex=i
}
}
}
if (d+1.0==1.0){
free(colex)
printf("Singular Matrix!\n")
return 0
}
else{
if (colex[k]!=k){
for (i=0i<ni++)
swap(a[i]+colex[k],a[i]+k)
s=s+colex[k]-k
}
if (rowex!=k){
for (j=0j<nj++)
swap(a[rowex]+j,a[k]+j)
for (j=0j<mj++)
swap(b[rowex]+j,b[k]+j)
s=s+rowex-k
}
}
d=a[k][k]
// *det=*det*d
for (j=k+1j<nj++) a[k][j]/=d
for (j=0j<mj++) b[k][j]/=d
for (i=k+1i<ni++){
for (j=k+1j<nj++)
a[i][j]-=a[i][k]*a[k][j]
for (j=0j<mj++)
b[i][j]-=a[i][k]*b[k][j]
}
}
for (i=n-2i>-1i--)
for (j=i+1j<nj++)
for (k=0k<mk++)
b[i][k]-=a[i][j]*b[j][k]
colex[n-1]=n-1
for (i=n-1i>-1i--)
if (colex[i]!=i)
for (j=0j<mj++) swap(b[colex[i]]+j,b[i]+j)
// if (s&1) *det=-*det
return 1
}
void main(){
#define N 2
#define M 1
double input_a[]={1,1,1,2}
double input_b[]={1,2}
double *a[N],*b[N]
int i
for (i=0i<Ni++){
a[i]=input_a+N*i
b[i]=input_b+M*i
}
rgauss(N,M,a,b)
printf("方程解为:\n")
printMatrix(N,M,b)
printf("\n")
}