用C语言写一个高斯消元法解方程组的程序

Python016

用C语言写一个高斯消元法解方程组的程序,第1张

我们以方程2x1 + 6x2 - x3 = -12

5x1 - x2 +2x3 = 29

-3x1 - 4x2 + x3 = 5

为例 来说明楼主自己把方程组化为矩阵形式。以下为源代码 。

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include <math.h>

int GS(int,double**,double *,double)

double **TwoArrayAlloc(int,int)

void TwoArrayFree(double **)

int main(void)

{

int i,n

double ep,**a,*b

n = 3

ep = 1e-4

a = TwoArrayAlloc(n,n)

b = (double *)calloc(n,sizeof(double))

if(b == NULL)

{

printf("memory get error\n")

exit(1)

}

a[0][0]= 2a[0][1]= 6a[0][2]= -1

a[1][0]= 5a[1][1]=-1a[1][2]= 2

a[2][0]=-3a[2][1]=-4a[2][2]= 1

b[0] = -12b[1] = 29 b[2] = 5

if(!GS(n,a,b,ep))

{

printf("can't solve it with GS elimination\n")

exit(0)

}

printf("The solution of equations is as follows:\n")

for(i=0i<3i++)

{

printf("x%d = %.2f\n",i,b[i])

}

TwoArrayFree(a)

free(b)

return 0

}

int GS(n,a,b,ep)

int n

double **a

double *b

double ep

{

int i,j,k,l

double t

for(k=1k<=nk++)

{

for(l=kl<=nl++)

if(fabs(a[l-1][k-1])>ep)

break

else if(l==n)

return(0)

if(l!=k)

{

for(j=kj<=nj++)

{

t = a[k-1][j-1]

a[k-1][j-1] =a[l-1][j-1]

a[l-1][j-1] =t

}

t=b[k-1]

b[k-1]=b[l-1]

b[l-1]=t

}

t=1/a[k-1][k-1]

for(j=k+1j<=nj++)

a[k-1][j-1]=t*a[k-1][j-1]

b[k-1]*=t

for(i=k+1i<=ni++)

{

for(j=k+1j<=nj++)

a[i-1][j-1]-=a[i-1][k-1]*a[k-1][j-1]

b[i-1]-=a[i-1][k-1]*b[k-1]

}

}

for(i=n-1i>=1i--)

for(j=i+1j<=nj++)

b[i-1]-=a[i-1][j-1]*b[j-1]

return(1)

}

double **TwoArrayAlloc(int r,int c)

{

double *x,**y

int n

x=(double *)calloc(r*c,sizeof(double))

y=(double **)calloc(r,sizeof(double*))

for(n=0n<=r-1++n)

{

y[n]=&x[c*n]

}

return y

}

void TwoArrayFree(double **x)

{

free(x[0])

free(x)

}

#include <iostream>

#include <iomanip.h>

using namespace std

#define N 20

double a[N][N]

double x[N+1]

double b[N+1]

int n//n方程个数,n未知数个数

int set( )

{

cout<<"请输入方程的个数和未知数个数: "<<endl

cin>>n

int i,j

cout<<"请输入方程组(逐个输入方程 i)"<<endl

for(i = 1i <= ni++)

{

for(j = 1j<=nj++)

{

cin>>a[i][j]//系数

}

cin>>b[i]//结果

}

return 0

}

int find(int k)//寻找第k列主元

{

int i,tag = k

double maxv=0

for(i = ki <= ni++)

{

if(a[i][k] >maxv)

{

maxv = a[i][k]

tag = i

}

}

return tag

}

void exchange(int i1,int i2)//将第 i1 i2行互换

{

int j

for(j = 1j <= nj++)

{

swap(a[i1][j],a[i2][j])

}

swap(b[i1],b[i2])

}

void div(int k)//让第k个方程的首项系数为1

{

double temp = a[k][k]

for(int j = kj <= nj++)

{

a[k][j]/=temp

}

b[k]/=temp

}

void disME(int k)

{

int i,j

for(i =1 i<=ni++)

{

for(j = ij<= nj++)

{

if(a[i][j])

{

if(a[i][j]==1)

{ if(j==n)

cout<<"x"<<j

else

cout<<"x"<<j<<" + "

}

else

{

if(j==n)

cout<<a[i][j]<<"x"<<j

else

cout<<a[i][j]<<"x"<<j<<" + "

}

}

}

cout<<" = "<<b[i]<<endl

}

system("pause")

}

void eliminate(int k)//消元

{

int i,j

double t

for(i = k+1i<= ni++)

{

t = a[i][k]/a[k][k]

for(j = kj <= nj++)

{

a[i][j]-=a[k][j] * t

}

b[i] -= b[k] * t

}

}

void Gauss()//高斯消元法

{

int i,j,k

for(k = 1k <nk++)//共进行n - 1次消元

{

int l = find(k)//寻找第k次消元法的主元方程

if(l!=k)

{

exchange(l,k)

}

//消元

div(k)

eliminate(k)

cout<<"第"<<k<<"次消元结果:"<<endl

disME(k)

}

div(k)

x[k] = b[k]

//disM()

for(i = n - 1i>=1i--)

{

for(j = i+1j <=n j++)

{

b[i] -= a[i][j] * b [j]

}

x[i] = b[i]

}

}

void dis()

{

int i

cout<<"解方程得:"<<endl

for(i = 1i<=ni++)

{

cout<<"x"<<i<<" = "

printf("%.5f\n",x[i])

}

}

int main()

{

set()

Gauss()

dis()

system("pause")

return 0

}

//TurboC 2.0太落后了,建议使用VC++6.0。

#include"stdio.h"

#include"math.h"

//最大49阶

#define N 50

void Gauss(float U[N][N],int n)

void main()

{

int n,i,j

float U[N][N]

printf("------------特殊说明---------------\n")

printf("当输出的数据含有<-1.#IND>时,表示在计算过程中数据已经出现溢出!\n")

printf("-----------------------------------\n")

printf("输入对应方程的阶数:")

scanf("%d",&n)

for(i=0i<Ni++)

for(j=0j<Nj++)

U[i][j]=0

printf("输入方程组的增广矩阵:\n")

for(i=0i<ni++)

for(j=0j<=nj++)

scanf("%f",&U[i][j])

Gauss(U,n)

}

//高斯选列主元消去法

void Gauss(float U[N][N],int n)

{

int i,j,m,row

float max,t,sum

float result[50]

for(m=0m<n-1m++)

{

//选取主元

max=U[m][m]

for(i=mi<ni++)

{

if(fabs(max)<fabs(U[i][m]))

{

max=U[i][m]

row=i

}

}

if(fabs(max)<0.01)

{

printf("主元接近于零,方法失效!\n")

return

}

else

{

if(max!=U[m][m])

{

for(j=mj<=nj++)

{

t=U[m][j]

U[m][j]=U[row][j]

U[row][j]=t

}

}

}

//消元

for(i=m+1i<ni++)

{

float t1,t2

t1=U[i][m]

t2=U[m][m]

U[i][m]=0

for(j=m+1j<=nj++)

U[i][j]=U[i][j]*t2-U[m][j]*t1

}

}

//回代求解

for(i=n-1i>=0i--)

{

if(i==n-1) result[i]=U[i][i+1]/U[i][i]

else

{

sum=0

for(j=i+1j<nj++)

sum=U[i][j]*result[j]+sum

result[i]=(U[i][n]-sum)/U[i][i]

}

}

//输出根

printf("高斯选列主元消去法求得的解为:\n")

for(i=0i<ni++)

printf("%3.3f ",result[i])

printf("\n")

}