高斯消去法 c语言

Python018

高斯消去法 c语言,第1张

#include<stdio.h>

#define demension 4//修改数组的维数可以在这里改动

void transferM(double array[][demension])

//上三角

{

int row1,row2,col

double m

for(row1=0row1<demensionrow1++)

{

for(row2=row1+1row2<demensionrow2++)

{

m=array[row2][row1]/array[row1][row1]

for(col=row1col<demensioncol++)

{

array[row2][col]-=array[row1][col]*m

}

}

}

}

void main()

{

double a[demension][demension]={

{3.2,2,5,3},

{34,45,64,23},

{23,34,54,5},

{23,34,4,56}

}

transferM(a)

for(int i=0i<4i++)

{

for(int j=0j<4j++)

{

printf("%6.2lf",a[i][j])

}

printf("\n")

}

}

#include<iostream>

#include<cmath>

using namespace std

#define MAX 50

void input(double a[MAX][MAX+1],int n)

{

cout<<"输入原方程的增广矩阵"<<endl

for(int i=0i<ni++)

for(int j=0j<n+1j++)

cin>>a[i][j]

}

void output(double x[],int n)

{

cout<<"Gauss 消去法得到的原方程组的解为"<<endl

for(int k=0k<nk++)

cout<<x[k]<<" "

}

int main()

{

double a[MAX][MAX+1],x[MAX],sum,max,t

int n,i,j,k,max_i

cout<<"输入原方程组的阶"<<endl cin>>n

input(a,n)

for(k=0k<n-1k++)//选主元素

{ max=a[k][k]

max_i=k

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

if(fabs(a[i][k])>fabs(max))

{

max=a[i][k]

max_i=i

}

if(max==0)

break

if(max_i!=k)//交换两行

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

{

t=a[k][j]

a[k][j]=a[max_i][j]

a[max_i][j]=t

}

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

{

a[i][k]=a[i][k]/-a[k][k]

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

a[i][j]=a[i][j]+a[i][k]*a[k][j]

}//消元

}

if(max==0)cout<<"原方程组无解"<<endl

else

{

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

{

sum=0

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

sum=sum+a[k][j]*x[j]

x[k]=(a[k][n]-sum)/a[k][k]

}//回代

output(x,n)

cout<<endl

}

return 0

}

#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

}