assdkijj 詢問~~

使用高斯消去法要如寫出阿

 

// Gauss element method

#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>
#define n 3

void gauss(double a[n][n], double b[n]);
void scaling(double a[n][n], double b[n], int i); // scaling
void p_pivot(double a[n][n], double b[n], int x); // partial pivoting
void inver_up(double a[n][n], double x[n], double b[n]); // 解出x的值
void show1(double a[n][n]);
void show2(double a[n]);


void main()
{
double a[n][n]={4,2,3,2,-4,-1,-1,1,4,},b[n]={7,1,-5};
cout<<"the original array A:"<<endl;show1(a);
gauss(a,b);
}

void gauss(double a[n][n], double b[n])
{
cout<<"With Gauss method :"<<endl;
for(int i=0; i<n-1; i++)
{
p_pivot(a,b,i);
for(int j=i+1; j<n; j++)
{
double m=a[j][i]/a[i][i];
for(int k=0; k<n; k++)
a[j][k]=a[j][k]-a[i][k]*m;
a[j][i]=0;

b[j]=b[j]-b[i]*m;
}
}
cout<<"Array A :"<<endl;show1(a);
cout<<"Array B :"<<endl;show2(b);
double x[n];
inver_up(a,x,b);
cout<<"Array X :"<<endl;show2(x);

}


void p_pivot(double a[n][n],double b[n],int x)
{
double max=a[x][x];
int y=x;

for(int i=x; i<n; i++)
if(abs(a[i][x])>abs(max))
{
max=a[i][x];
y=i;
}

if(i!=x)
{
for(int j=0; j<n; j++)
{
double temp1=a[x][j];
a[x][j]=a[y][j];
a[y][j]=temp1;
}

double temp2=b[x];
b[x]=b[y];
b[y]=temp2;
}
}

void scaling(double a[n][n], double b[n], int i)
{
double max=a[i][0];

for(int j=1; j<n; j++)
if(abs(a[i][j])>abs(max))
max=a[i][j];

for(int k=0; k<n; k++)
a[i][k]=a[i][k]/max;
b[i]=b[i]/max;
}


void inver_up(double a[n][n], double x[n], double b[n])
{
for(int i=n-1; i>=0; i--)
{
double sum=0;
for(int j=i+1; j<n; j++)
sum=sum+a[i][j]*x[j];
x[i]=(b[i]-sum)/a[i][i];
}
}


void show1(double a[n][n])
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
printf("%12f",a[i][j]);
cout<<endl;
}
}

void show2(double a[n])
{
for(int i=0; i<n; i++)
printf("%12f",a[i]);
cout<<endl;
}

arrow
arrow
    全站熱搜

    NBPBlog 發表在 痞客邦 留言(0) 人氣()