?? gauss.cpp
字號:
//該程序由goldsen編寫,僅供學習交流之用.goldsen2003@yahoo.com.cn
//參考課本第二章例一,實現功能:順序高斯消去法、列主元素消去法、全主元素消去法
//水平有限,不妥之處請批評指正,轉載請注明出處:)
//////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "math.h"
////定義外部變量///////////////////
double A[10][10];
double B[10];
double X[10];
double b1=0.6781,b2=12.1,b3=981;
signed int n=3;//選擇矩陣的階次
///////////////////////////////////
void input_matrix()
{
signed int c;//選擇矩陣輸入方式
static signed int i=1;//輸出行
signed int j=1;//輸出列
double a11=0.167,a12=0.01,a13=0.012,a21=5.91,a22=0.8334,a23=1,a31=4.2,a32=1200,a33=3200;//默認三階矩陣
double a=0;
///////////////初始化矩陣空間,矩陣初始大小取決于外部變量定義,預設最大矩陣10,遇到不同情況可作更改
for (i=1;i<=10;i++)
{
for (j=1;j<=10;j++)
{
A[i-1][j-1]=0;
}
B[i-1]=0;
X[i-1]=0;
}
printf("Please insert your matrix.(0=default,1=insert)\n");
scanf("%d",&c);
if (0==c)
{
printf("you have chosen the default marix.\n");
printf("The matrix is:\n");
A[0][0]=a11;
A[0][1]=a12;
A[0][2]=a13;
A[1][0]=a21;
A[1][1]=a22;
A[1][2]=a23;
A[2][0]=a31;
A[2][1]=a32;
A[2][2]=a33;
B[0]=b1;
B[1]=b2;
B[2]=b3;
for (i=1;i<=3;i++)
{
for (j=1;j<=3;j++)
{
printf("%f \t",A[i-1][j-1]);
}
printf("\n");
}
printf("vector b is:\n%f\n%f\n%f\n\n",b1,b2,b3);
}
else if (1==c)
{
printf("Please insert rank(階次) n.\n");
scanf("%d",&n);
printf("Please insert %d elements in your matrix.\n",n*n);
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
scanf("%lf",&a);
A[i-1][j-1]=a;
}
}
printf("The matrix is:\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
printf("%f \t",A[i-1][j-1]);
}
printf("\n");
}
printf("Please insert %d elements in vector b.\n",n);
for (i=1;i<=n;i++)
{
scanf("%lf",&a);
B[i-1]=a;
}
printf("vector b is:\n");
for (i=1;i<=n;i++)
{
printf("%f\n",B[i-1]);
}
printf("\n");
}
else
{
printf("you insert a wrong number.\n");
}
}
double abs_double(double abs_in)/////////////double型取絕對值
{
double abs_out;
if (abs_in<=0)
{
abs_out=-abs_in;///////////////////////////////////取絕對值////////////
}
else
{
abs_out=abs_in;
}
return abs_out;
}
void Gauss_shunxu()///////////////////////////////////////////////////////順序高斯消元法
{
signed int k;//消元次數
signed int i;//行控制
signed int j;//列控制
double flag;
double e=0.0001;//控制精度
double m=0;//消元因子
double Sum=0;//回代求和
/////////消元過程
for (k=0;k<n-1;k++)
{
flag=abs_double(A[k][k]);/////////////////////////////////////////////////判斷Akk的值,使之非零。
if (flag<=e)
{
printf("A[%d][%d] is zero,wrong!",k+1,k+1);
return;
}
////////////////////////////////////////////////////////////
for (i=k;i<=n-1;i++)
{
m=-A[i+1][k]/A[k][k];
for (j=k;j<=n-1;j++)
{
A[i+1][j]=A[i+1][j]+m*A[k][j];
}
B[i+1]=B[i+1]+m*B[k];
}
printf("step%d:\n",k+1);
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
printf("%f \t",A[i-1][j-1]);
}
printf("\n");
}
printf("vector b is:\n");
for (i=1;i<=n;i++)
{
printf("%f\n",B[i-1]);
}
printf("\n");
}
///////////////////////////////////////////////回代過程
flag=abs_double(A[n-1][n-1]);
if (flag<=e)//////////////////////////////////////////////////////////////////////////判斷Ann的值,使之非零。
{
printf("A[%d][%d] is zero,wrong!\n",n-1,n-1);
return;
}
//////////////////////////////////////////////////////////////////////////
X[n-1]=B[n-1]/A[n-1][n-1];
for (k=n-1;k>=1;k--)
{
for (j=n-1;j>=k;j--)
{
Sum+=A[k-1][j]*X[j];
}
X[k-1]=(B[k-1]-Sum)/A[k-1][k-1];
Sum=0;
}
printf("The %d roots is:\n",n);
for (i=1;i<=n;i++)
{
printf("%f\n",X[i-1]);
}
}
void Gauss_liezhu()//////////////////////////////////////////////////////列主元素消去法
{
signed int k;//消元次數
signed int i;//行控制
signed int j;//列控制
double flag;
double e=0.00001;//控制精度
double m=0;//消元因子
double Sum=0;//回代求和
double max_A;
double t_A;
signed int ik;
/////////消元過程
for (k=0;k<n-1;k++)
{
//////////////////////////////////////////////////////////////////////////交換k行和ik行
for (i=k,max_A=A[k][k],ik=k;i<=n-1;i++)
{
if (abs_double(max_A)<abs_double(A[i][k]))
{
max_A=A[i][k];
ik=i;
}
}
for (j=0;j<=n-1;j++)
{
t_A=A[k][j];
A[k][j]=A[ik][j];
A[ik][j]=t_A;
}
t_A=B[k];
B[k]=B[ik];
B[ik]=t_A;
//////////////////////////////////////////////////////////////////////////
flag=abs_double(A[k][k]);/////////////////////////////////////////////////判斷Akk的值,使之非零。
if (flag<=e)
{
printf("A[%d][%d] is zero,wrong!",k+1,k+1);
return;
}
////////////////////////////////////////////////////////////
for (i=k;i<=n-1;i++)
{
m=-A[i+1][k]/A[k][k];
for (j=k;j<=n-1;j++)
{
A[i+1][j]=A[i+1][j]+m*A[k][j];
}
B[i+1]=B[i+1]+m*B[k];
}
printf("step%d:\n",k+1);
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
printf("%f \t",A[i-1][j-1]);
}
printf("\n");
}
printf("vector b is:\n");
for (i=1;i<=n;i++)
{
printf("%f\n",B[i-1]);
}
printf("\n");
}
///////////////////////////////////////////////回代過程
flag=abs_double(A[n-1][n-1]);
if (flag<=e)//////////////////////////////////////////////////////////////////////////判斷Ann的值,使之非零。
{
printf("A[%d][%d] is zero,wrong!\n",n-1,n-1);
return;
}
//////////////////////////////////////////////////////////////////////////
X[n-1]=B[n-1]/A[n-1][n-1];
for (k=n-1;k>=1;k--)
{
for (j=n-1;j>=k;j--)
{
Sum+=A[k-1][j]*X[j];
}
X[k-1]=(B[k-1]-Sum)/A[k-1][k-1];
Sum=0;
}
printf("The %d roots is:\n",n);
for (i=1;i<=n;i++)
{
printf("%f\n",X[i-1]);
}
}
void Gauss_quanzhu()//////////////////////////////////////////////////////全主元素消去法
{
signed int k;//消元次數
signed int i;//行控制
signed int j;//列控制
double flag;
double e=0.00001;//控制精度
double m=0;//消元因子
double Sum=0;//回代求和
double max_A;
double t_A;
signed int ik,jk;
signed int order[10];//初始化矩陣空間,記錄全主元的變量順序,預設最大矩陣10,遇到不同情況可作更改
for (i=0;i<=n-1;i++)
{
order[i]=i;
}
/////////消元過程
for (k=0;k<n-1;k++)
{
//////////////////////////////////////////////////////////////////////////查找k行k列之后元素絕對值最大數
for (i=k,max_A=A[k][k],jk=k,ik=k;i<=n-1;i++)
{
for (j=k;j<=n-1;j++)
{
if (abs_double(max_A)<abs_double(A[i][j]))
{
ik=i;
jk=j;
}
}
}
for (j=0;j<=n-1;j++)////交換行
{
t_A=A[k][j];
A[k][j]=A[ik][j];
A[ik][j]=t_A;
}
t_A=B[k];////交換b
B[k]=B[ik];
B[ik]=t_A;
for (i=0;i<=n-1;i++)//交換列
{
t_A=A[i][k];
A[i][k]=A[i][jk];
A[i][jk]=t_A;
}
i=order[jk];//記錄列變序號
order[jk]=order[k];
order[k]=i;
//////////////////////////////////////////////////////////////////////////
flag=abs_double(A[k][k]);/////////////////////////////////////////////////判斷Akk的值,使之非零。
if (flag<=e)
{
printf("A[%d][%d] is zero,wrong!",k+1,k+1);
return;
}
////////////////////////////////////////////////////////////
for (i=k;i<=n-1;i++)
{
m=-A[i+1][k]/A[k][k];
for (j=k;j<=n-1;j++)
{
A[i+1][j]=A[i+1][j]+m*A[k][j];
}
B[i+1]=B[i+1]+m*B[k];
}
printf("step%d:\n",k+1);
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
printf("%f \t",A[i-1][j-1]);
}
printf("\n");
}
printf("vector b is:\n");
for (i=1;i<=n;i++)
{
printf("%f\n",B[i-1]);
}
printf("\n");
}
///////////////////////////////////////////////回代過程
flag=abs_double(A[n-1][n-1]);
if (flag<=e)//////////////////////////////////////////////////////////////////////////判斷Ann的值,使之非零。
{
printf("A[%d][%d] is zero,wrong!\n",n-1,n-1);
return;
}
//////////////////////////////////////////////////////////////////////////
X[n-1]=B[n-1]/A[n-1][n-1];
for (k=n-1;k>=1;k--)
{
for (j=n-1;j>=k;j--)
{
Sum+=A[k-1][j]*X[j];
}
X[k-1]=(B[k-1]-Sum)/A[k-1][k-1];
Sum=0;
}
printf("The %d roots is:\n",n);
for (i=1;i<=n;i++)
{
printf("X[%d]=%f\n",order[i-1]+1,X[i-1]);
}
}
void main()
{
signed int c;
input_matrix();
printf("plsease choose the method for guass elimination.(0=順序Guass,1=列主元素Guass,2=全主元Guass)\n");
scanf("%d",&c);
if (0==c)
{
Gauss_shunxu();
return;
}
else if (1==c)
{
Gauss_liezhu();
return;
}
else if (2==c)
{
Gauss_quanzhu();
return;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -