C语言程序解线性方程组

Python012

C语言程序解线性方程组,第1张

给,下面的代码已经编译运行确认,肯定好用了,试试吧:)

#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)

printf("\n现在输入系数矩阵A和向量b:")

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")

}