當前位置:首頁 » 編程語言 » 高斯消元法c語言

高斯消元法c語言

發布時間: 2023-08-23 18:48:33

『壹』 高斯先列主消元法求解線性方程組AX=b c語言

其中用到了高斯先列主消元法 #include <iostream.h>
#include <stdlib.h>
#include <math.h>

/*樓競網站www.LouJing.com
擁有該程序的版權,轉載請保留該版權.
謝謝合作!*/
double* allocMem(int ); //分配內存空間函數
void GaussLineMain(double*,double*,double*,int );//採用高斯列主元素消去法求解x的初始向量值
void Jacobi(double*,double*,double*,double*,int,int);//利用雅可比迭代公式求解x的值

void main()
{
short matrixNum; //矩陣的行數(列數)
double *matrixA; //矩陣A,初始系數矩陣
double *matrixD; //矩陣D為A中的主對角陣
double *matrixL; //矩陣L為A中的下三角陣
double *matrixU; //矩陣U為A中的上三角陣
double *B; //矩陣B為雅可比方法迭代矩陣
double *f; //矩陣f為中間的過渡的矩陣
double *x; //x為一維數組,存放結果
double *xk; //xk為一維數組,用來在迭代中使用
double *b; //b為一維數組,存放方程組右邊系數

int i,j,k;

cout<<"<<請輸入矩陣的行數(列數與行數一致)>>:";
cin>>matrixNum;

//分別為A、D、L、U、B、f、x、b分配內存空間
matrixA=allocMem(matrixNum*matrixNum);
matrixD=allocMem(matrixNum*matrixNum);
matrixL=allocMem(matrixNum*matrixNum);
matrixU=allocMem(matrixNum*matrixNum);
B=allocMem(matrixNum*matrixNum);
f=allocMem(matrixNum);
x=allocMem(matrixNum);
xk=allocMem(matrixNum);
b=allocMem(matrixNum);

//輸入系數矩陣各元素值
cout<<endl<<endl<<endl<<"<<請輸入矩陣中各元素值(為 "<<matrixNum<<"*"<<matrixNum<<",共計 "<<matrixNum*matrixNum<<" 個元素)"<<">>:"<<endl<<endl;
for(i=0;i<matrixNum;i++)
{
cout<<"請輸入矩陣中第 "<<i+1<<" 行的 "<<matrixNum<<" 個元素:";
for(j=0;j<matrixNum;j++)
cin>>*(matrixA+i*matrixNum+j);
}

//輸入方程組右邊系數b的各元素值
cout<<endl<<endl<<endl<<"<<請輸入方程組右邊系數各元素值,共計 "<<matrixNum<<" 個"<<">>:"<<endl<<endl;
for(i=0;i<matrixNum;i++)
cin>>*(b+i);

/* 下面將A分裂為A=D-L-U */
//首先將D、L、U做初始化工作
for(i=0;i<matrixNum;i++)
for(j=0;j<matrixNum;j++)
*(matrixD+i*matrixNum+j)=*(matrixL+i*matrixNum+j)=*(matrixU+i*matrixNum+j)=0;
//D、L、U分別得到A的主對角線、下三角和上三角;其中D取逆矩陣、L和U各元素取相反數
for(i=0;i<matrixNum;i++)
for(j=0;j<matrixNum;j++)
if(i==j&&*(matrixA+i*matrixNum+j)) *(matrixD+i*matrixNum+j)=1/(*(matrixA+i*matrixNum+j));
else if(i>j) *(matrixL+i*matrixNum+j)=-*(matrixA+i*matrixNum+j);
else *(matrixU+i*matrixNum+j)=-*(matrixA+i*matrixNum+j);
//求B矩陣中的元素
for(i=0;i<matrixNum;i++)
for(j=0;j<matrixNum;j++)
{
double temp=0;
for(k=0;k<matrixNum;k++)
temp+=*(matrixD+i*matrixNum+k)*(*(matrixL+k*matrixNum+j)+*(matrixU+k*matrixNum+j));
*(B+i*matrixNum+j)=temp;
}
//求f中的元素
for(i=0;i<matrixNum;i++)
{
double temp=0;
for(j=0;j<matrixNum;j++)
temp+=*(matrixD+i*matrixNum+j)*(*(b+j));
*(f+i)=temp;
}

/* 計算x的初始向量值 */
GaussLineMain(matrixA,x,b,matrixNum);

/* 利用雅可比迭代公式求解xk的值 */
int JacobiTime;
cout<<endl<<endl<<endl<<"<<雅可比迭代開始,請輸入希望迭代的次數>>:";
cin>>JacobiTime;
while(JacobiTime<=0)
{
cout<<"迭代次數必須大於0,請重新輸入:";
cin>>JacobiTime;
}
Jacobi(x,xk,B,f,matrixNum,JacobiTime);

//輸出線性方程組的解 */
cout<<endl<<endl<<endl<<"<<方程組運算結果如下>>"<<endl;
cout.precision(20); //設置輸出精度,以此比較不同迭代次數的結果
for(i=0;i<matrixNum;i++)
cout<<"x"<<i+1<<" = "<<*(xk+i)<<endl;

cout<<endl<<endl<<"求解過程結束..."<<endl<<endl;

//釋放掉所有動態分配的內存
delete [] matrixA;
delete [] matrixD;
delete [] matrixL;
delete [] matrixU;
delete [] B;
delete [] f;
delete [] x;
delete [] xk;
delete [] b;
}

/*--------------------
分配內存空間函數
www.LouJing.com
--------------------*/
double* allocMem(int num)
{
double *head;
if((head=new double[num])==NULL)
{
cout<<"內存空間分配失敗,程序終止運行!"<<endl;
exit(0);
}
return head;
}

/*---------------------------------------------
計算Ax=b中x的初始向量值,採用高斯列主元素消去法
www.LouJing.com
---------------------------------------------*/
void GaussLineMain(double* A,double* x,double* b,int num)
{
int i,j,k;

//共處理num-1行
for(i=0;i<num-1;i++)
{
//首先每列選主元,即最大的一個
double lineMax=fabs(*(A+i*num+i));
int lineI=i;
for(j=i;j<num;j++)
if(fabs(*(A+j*num+i))>fabs(lineMax)) lineI=j;

//主元所在行和當前處理行做行交換,右系數b也隨之交換
for(j=i;j<num;j++)
{
//A做交換
lineMax=*(A+i*num+j);
*(A+i*num+j)=*(A+lineI*num+j);
*(A+lineI*num+j)=lineMax;
//b中對應元素做交換
lineMax=*(b+i);
*(b+i)=*(b+lineI);
*(b+lineI)=lineMax;
}

if(*(A+i*num+i)==0) continue; //如果當前主元為0,本次循環結束

//將A變為上三角矩陣,同樣b也隨之變換
for(j=i+1;j<num;j++)
{
double temp=-*(A+j*num+i)/(*(A+i*num+i));
for(k=i;k<num;k++)
{
*(A+j*num+k)+=temp*(*(A+i*num+k));
}
*(b+j)+=temp*(*(b+i));
}
}

/* 驗證Ax=b是否有唯一解,就是驗證A的行列式是否為0;
如果|A|!=0,說明有唯一解*/
double determinantA=1;
for(i=0;i<num;i++)
determinantA*=*(A+i*num+i);
if(determinantA==0)
{
cout<<endl<<endl<<"通過計算,矩陣A的行列式為|A|=0,即A沒有唯一解。\n程序退出..."<<endl<<endl;
exit(0);
}

/* 從最後一行開始,回代求解x的初始向量值 */
for(i=num-1;i>=0;i--)
{
for(j=num-1;j>i;j--)
*(b+i)-=*(A+i*num+j)*(*(x+j));
*(x+i)=*(b+i)/(*(A+i*num+i));
}
}

/*------------------------------------
利用雅可比迭代公式求解x的精確值
www.LouJing.com
迭代公式為:xk=Bx+f
------------------------------------*/
void Jacobi(double* x,double* xk,double* B,double* f,int num,int time)
{
int t=1,i,j;
while(t<=time)
{
for(i=0;i<num;i++)
{
double temp=0;
for(j=0;j<num;j++)
temp+=*(B+i*num+j)*(*(x+j));
*(xk+i)=temp+*(f+i);
}

//將xk賦值給x,准備下一次迭代
for(i=0;i<num;i++)
*(x+i)=*(xk+i);
t++;
}
}

『貳』 【編程求助】用c語言或者c++編程,實現用高斯消元法求解線性方程組Ax=b。

void gaussj(double a[], int n, double b[])
{
int i,j,k,l,ll,irow,icol;
double big,pivinv,m;
int ipiv[50], indxr[50], indxc[50];
for (j=0;j<=n-1;j++)
{
ipiv[j]=0;
}
for (i=0;i<=n-1;i++)
{
big=0.0;
for (j=0;j<=n-1;j++)
{
if(ipiv[j]!=1)
{
for(k=0;k<=n-1;k++)
{
if(ipiv[k]==0)
{
if(fabs(a[j*n+k])>=big)
{
big=fabs(a[j*n+k]);
irow=j;
icol=k;
}
else if(ipiv[k]>1)
{
cout<<"singular matrix";
}
}
}
}
}
ipiv[icol]=ipiv[icol]+1;
if(irow!=icol)
{
for(l=0;l<=n-1;l++)
{
m=(a[irow*n+l]);
a[irow*n+l]=a[icol*n+l];
a[icol*n+l]=m;
}
m=b[irow];
b[irow]=b[icol];
b[icol]=m;
}
indxr[i]=irow;
indxc[i]=icol;
if(a[icol*n+icol]==0.0)
{
cout<< "singular matrix.";
}
pivinv=1.0/(a[icol*n+icol]);
a[icol*n+icol]=1.0;
for(l=0;l<=n-1;l++)
{
a[icol*n+l]=a[icol*n+l]*pivinv;
}
b[icol]=b[icol]*pivinv;
for(ll=0;ll<=n-1;ll++)
{
if(ll!=icol)
{
m=a[ll*n+icol];
a[ll*n+icol]=0.0;
for(l=0;l<=n-1;l++)
{
a[ll*n+l]=a[ll*n+l]-a[icol*n+l]*m;
}
b[ll]=b[ll]-b[icol]*m;
}
}
}
for(l=n-1;l<=0;l--)
{
if(indxr[l]!=indxc[l])
{
for(k=0;k<=n-1;k++)
{
m=a[k*n+indxr[l]];
a[k*n+indxr[l]]=a[k*n+indxc[l]];
a[k*n+indxr[l]]=m;
}
}
}
}

『叄』 採用高斯先列主元消元法求解線性方程組AX=b,編寫一個程序C語言,急需

這個程序我做過的。LZ檢驗下: // 高斯消元求矩陣逆。
#include<stdio.h>
#include<math.h>#define N 100//定義矩陣的最大行int n;//表示矩陣的行,列。
double matix[N][N];//矩陣的最大行,最大列不
double unit[N][N];bool findmax(int s)//從s到n行選擇最大的,作為主元。
{
int i,j,k;
double mas,temp;
mas=fabs(matix[s][s]);k=s;
for(i=s+1;i<n;i++)
{
if(mas<fabs(matix[i][s])) {mas=fabs(matix[i][s]);k=i;}
}
if(mas==0) return false;
//交換兩行
for(j=0;j<n;j++)
{
temp=matix[s][j];
matix[s][j]=matix[k][j];
matix[k][j]=temp;

temp=unit[s][j];
unit[s][j]=unit[k][j];
unit[k][j]=temp;
}
return true;
}void chuli(int s)
{
int i,j;
double mas=matix[s][s],r;
for(i=s+1;i<n;i++)
{
r=matix[i][s]/mas;
for(j=0;j<n;j++)
{
matix[i][j]=matix[i][j]-matix[s][j]*r;
unit[i][j]=unit[i][j]-unit[s][j]*r;
}
}
}void solve(int s)
{
int i,j;
double mas;
mas=matix[s][s];
for(i=s;i<n;i++)
matix[s][i]=matix[s][i]/mas;
for(i=0;i<n;i++)
unit[s][i]=unit[s][i]/mas;

for(i=s-1;i>=0;i--)
{
mas=matix[i][s];
matix[i][s]=0;
for(j=0;j<n;j++)
unit[i][j]=unit[i][j]-mas*unit[s][j];
}

}
int main()
{
int i,j;
//輸入
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j) unit[i][j]=1;
else unit[i][j]=0;
scanf("%lf",&matix[i][j]);
}
}
//輸出

//轉成上三角
for(i=0;i<n-1;i++)
{
//每一次選一個絕對值最大的值作為aii
if(findmax(i))
{
chuli(i);
}
else
{
printf("該矩陣不可逆");
return 0;
}
}
//轉成單位陣
for(i=n-1;i>=0;i--)
{
solve(i);
}

//其逆矩陣是
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%.2lf ",unit[i][j]);
printf("\n");
}
return 0;
}

『肆』 C語言用高斯消元法解n元線性方程

#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.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 r,k,i,j;
char celect;
system("cls");

printf("\n\n用Gauss列主元消元法解線性方程組");
printf("\n\n1.解方程組請按Enter.");
printf("\n\n2.退出程式請按Esc.");
celect=getch();
if(celect==Esc)
exit(0);
printf("\n\n 輸入方程組的維數:n=");
scanf("%d",&n);
printf(" \n\n現在輸入系數矩陣A和向量b:");
for(i=1;i<=n;i++)
{
printf("\n\n請輸入a%d1--a%d%d系數和向量b%d:",i,i,n,i);
/*實現將每一行中的系數和向量一次性輸入,數之間用空格格開,輸完後回車確定*/

for(j=1;j<=n+1;j++) /*將剛才輸入的數存入數組*/
scanf("%f",&A[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=max(k);
if(ark==0) /*判斷方程是否為線性方程,即是否合法*/
{
printf("\n\n此方程組不合法!");message();
}
else if(flag!=k)
exchange(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
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-1;k>=1;k--)
{
float me=0;
for(j=k+1;j<=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i<=n;i++)
{
printf(" \n\nx%d=%f",i,x[i]);
}
message();

return 1;
}

void exchange(int r,int k) /*交換行的矩函數*/
{
int i;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
A[k][i]=A[0][i];
}

float max(int k) /*比校系數大小的函數*/
{
int i;
float temp=0;
for(i=k;i<=n;i++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k]);
flag=i;
}
return temp;
}

void message() /*實現菜單選擇的函數*/
{
printf("\n\n 繼續運算按 Enter ,退出程式按 Esc!");
switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("\n\n不合法的輸入!");message();}
}
}

『伍』 用C語言編程高斯全主元消元法

//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=0;i<N;i++)
for(j=0;j<N;j++)
U[i][j]=0;
printf("輸入方程組的增廣矩陣:\n");
for(i=0;i<n;i++)
for(j=0;j<=n;j++)
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=0;m<n-1;m++)
{
//選取主元
max=U[m][m];
for(i=m;i<n;i++)
{
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=m;j<=n;j++)
{
t=U[m][j];
U[m][j]=U[row][j];
U[row][j]=t;
}
}
}
//消元
for(i=m+1;i<n;i++)
{
float t1,t2;
t1=U[i][m];
t2=U[m][m];
U[i][m]=0;
for(j=m+1;j<=n;j++)
U[i][j]=U[i][j]*t2-U[m][j]*t1;
}
}
//回代求解
for(i=n-1;i>=0;i--)
{
if(i==n-1) result[i]=U[i][i+1]/U[i][i];
else
{
sum=0;
for(j=i+1;j<n;j++)
sum=U[i][j]*result[j]+sum;
result[i]=(U[i][n]-sum)/U[i][i];
}
}
//輸出根
printf("高斯選列主元消去法求得的解為:\n");
for(i=0;i<n;i++)
printf("%3.3f ",result[i]);
printf("\n");

}

『陸』 用c語言實現高斯消去法,解三元一次方程組。求具體程序!!

#include<iostream>

#include<cmath>

usingnamespacestd;

#defineMAX50

voidinput(doublea[MAX][MAX+1],intn)

{

cout<<"輸入原方程組的增廣矩陣"<<endl;

for(inti=0;i<n;i++)

for(intj=0;j<n+1;j++)

cin>>a[i][j];

}

voidoutput(doublex[],intn)

{

cout<<"Gauss消去法得到的原方程組的解為"<<endl;

for(intk=0;k<n;k++)

cout<<x[k]<<"";

}

intmain()

{

doublea[MAX][MAX+1],x[MAX],sum,max,t;

intn,i,j,k,max_i;

cout<<"輸入原方程組的階"<<endl;cin>>n;

input(a,n);

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

{max=a[k][k];

max_i=k;

for(i=k+1;i<n;i++)

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

{

max=a[i][k];

max_i=i;

}

if(max==0)

break;

if(max_i!=k)//交換兩行

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

{

t=a[k][j];

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

a[max_i][j]=t;

}

for(i=k+1;i<n;i++)

{

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

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

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

}//消元

}

if(max==0)cout<<"原方程組無解"<<endl;

else

{

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

{

sum=0;

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

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

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

}//回代

output(x,n);

cout<<endl;

}

return0;

}

熱點內容
c語言定義pi的 發布:2025-03-16 01:51:08 瀏覽:603
一劍破天腳本 發布:2025-03-16 01:48:03 瀏覽:965
dex優化編譯 發布:2025-03-16 01:45:54 瀏覽:224
硬碟緩存路徑怎麼設置 發布:2025-03-16 01:45:46 瀏覽:960
最好的pythonide 發布:2025-03-16 01:42:56 瀏覽:693
androidbitmap處理 發布:2025-03-16 01:42:08 瀏覽:544
預算管理如何實現資源配置 發布:2025-03-16 01:33:02 瀏覽:615
阿里雲伺服器上傳圖片指令 發布:2025-03-16 01:27:25 瀏覽:27
狼戰2ftp 發布:2025-03-16 01:27:18 瀏覽:677
android濾波 發布:2025-03-16 01:25:02 瀏覽:624