c語言高斯消元
1. 用高斯消元法解三元一次方程組,c語言
參閱我的文章:http://wenku..com/view/d4ea2273650e52ea5418981d.html
#include "stdafx.h" //VS 預編譯頭文件,其他系統請刪除
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<math.h>
#include<time.h>
//VS 2013 否決了 scanf 等函數,為了使用,加上下句。
//其他系統請刪除
#pragma warning(disable:4996)
int GaussJordanElimination(int n, const double *pCoef, double *pOut);
//VS 主函數簽名格式。其他系統請改變簽名,如:
//int main()
int _tmain(int argc, _TCHAR* argv[])
{
double cf[3][4] = { {-0.02, 2.0, 2.0, 0.4}, {1.0, 0.78125, 0.0, 1.3816}, {3.996, 5.526, 4.0, 7.4178} };
double rs[3];
int i;
i = GaussJordanElimination(3, (double*)cf, rs);
printf("x1 = %lf, x2 = %lf, x3 = %lf\n", rs[0], rs[1], rs[2]);
system("pause"); //避免窗口一閃而退
return 0;
}
//絕對值函數
__inline double _abs(double v)
{
return v < 0 ? -v : v;
}
//線性方程組列主元高斯消元法
//n 方程元數;pCoef 系數,必須以行主序方式存放的二維數組;
//pOut 長度為 n 的一維數組(調用者負責維護),用於輸出數據
//返回值:0 成功,-1 無解,1 申請內存失敗, 2 不定解。
int GaussJordanElimination(int n, const double *pCoef, double *pOut)
{
double *pcf;
int rows = n, columns = n + 1;
//pcf = new double[rows * columns];
pcf = (double*)malloc(rows * columns * sizeof(double));
if (pcf == 0) return 1; //巧婦難為無米之炊,內存都申請不到,還能幹嘛!
memcpy(pcf, pCoef, (rows * columns) * sizeof(double)); //據說這個運行效率很高
int r, c, i; //循環變數
int a, b;
double x, y;
//開始消元,將 pcf 方陣區處理成到直角三角形(直角在右上角)矩陣
for (r = 0; r < rows - 1; r++)
{
//選取主元
a = r; x = _abs(pcf[r * columns + r]);
for (i = r + 1; i < rows; i++)
{ //查找主元在哪行
if (x < _abs(pcf[i * columns + r])) a = i;
}
if (a > r)
{ //主元不是當前行(r),比較麻煩,需要將第 a 行與第 r 行兌換
//第 r 列前面的就不要對換了,因為這些項已經被消元,變成 0 了
for (c = r; c < columns; c++)
{
x = pcf[r * columns + c];
pcf[r * columns + c] = pcf[a * columns + c];
pcf[a * columns + c] = x;
}
}
//開始消元
a = r * columns; //記住將主元的行地址偏移量,以提高程序運行效率
x = -pcf[a + r]; //要多次使用,記下她,以提高程序運行效率
if (x == 0) //主元居然為 0,純粹是想坑爹,豈能上當!
continue; //繼續後面的消元,以便最終判斷是無解還是任意解
for (i = r + 1; i < rows; i++)
{ //正在消元
b = i * columns;//記住將要消元的行地址偏移量,以提高程序運行效率
y = pcf[b + r]; //要多次使用,記下她,以提高程序運行效率
if (y != 0)
{ //y == 0,本行不需要消元
y /= x; //要多次使用,記下她,以提高程序運行效率
pcf[b + r] = 0; //肯定為 0,不用計算。
for (c = r + 1; c < columns; c++)
pcf[b + c] += pcf[a + c] * y;
}
}
}//至此,pcf 方陣區已經處理成到直角三角形(直角在右上角)矩陣
//回代,將 pcf 方陣區處理成主對角線為 1,其他為 0 的矩陣
int columns_1 = c = columns - 1; //多次用到,提高效率
for (r = rows - 1; r >= 1; r--)
{
b = r * columns;
if (pcf[b + r] == 0)
{ //經過前面的消元,除主元外,其他元應該都為 0
if (pcf[b + columns_1] == 0)
{ //常數項為 0,方程有不定解
free(pcf);
return 2;
}
else
{ //常數項為 0,方程有無解
free(pcf); //釋放內存
return -1;
}
}
pcf[b + columns_1] /= pcf[b + r];
pcf[b + r] = 1; //肯定為 1,不用計算。
y = -pcf[b + columns_1];
//回代
for (i = r - 1; i >= 0; i--)
{
pcf[i * columns + columns_1] += pcf[i * columns + r] * y;
pcf[i * columns + r] = 0; //已經回代,此項已消,置為 0。
}
}
//處理第一行數據
pcf[columns_1] /= pcf[0];
pcf[0] = 1;
//至此,回代過程結束,pcf 矩陣的最後一列就是結果
//返回結果
for (r = 0; r < rows; r++)
pOut[r] = pcf[r * columns + columns_1];
free(pcf);
return 0;
}
2. 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();}
}
}
3. 用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;
}
4. 如何用編程實現高斯列主元消去法
用C語言編制以下程序:
#include <stdio.h>
#include <math.h>
void main()
{
int i,j,k,ik,n;
float max,t,a[10][10],x[10],sum;
printf("請輸入方程組的階數:");
scanf("%d",&n);
printf("請輸入增廣矩陣\n");
for (i=1;i<=n;i++)
for (j=1;j<=n+1;j++)
scanf("%f",&a[i][j]);
for (k=1;k<=n-1;k++)
{
max=0.0;
for (i=k;i<=n;i++)
if (max<fabs(a[i][k]))
{
max=fabs(a[i][k]);
ik=i;
}
if (max==0)
{
printf("A is singular");
break;
}
if (ik!=k)
for (j=k;j<=n+1;j++)
{
t=a[k][j];
a[k][j]=a[ik][j];
a[ik][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 (a[n][n]==0)
printf("A is singular");
else
x[n]=a[n][n+1]/a[n][n];
for (k=n-1;k>=1;k--)
{
sum=0.0;
for (j=k+1;j<=n;j++)
sum=sum+a[k][j]*x[j];
x[k]=(a[k][n+1]-sum)/a[k][k];
}
for (i=1;i<=n;i++)
printf("x[%d]=%f\n",i,x[i]);
}
5. 用c語言編程高斯全主元消去法(請用圖中的過程)
#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 = 1;i <= n;i++)
{
for(j = 1;j<=n;j++)
{
cin>>a[i][j];//系數
}
cin>>b[i];//結果
}
return 0;
}
int find(int k)//尋找第k列主元
{
int i,tag = k;
double maxv=0;
for(i = k;i <= n;i++)
{
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 = 1;j <= n;j++)
{
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 = k; j <= n;j++)
{
a[k][j]/=temp;
}
b[k]/=temp;
}
void disME(int k)
{
int i,j;
for(i =1 ;i<=n;i++)
{
for(j = i;j<= n;j++)
{
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+1;i<= n;i++)
{
t = a[i][k]/a[k][k];
for(j = k;j <= n;j++)
{
a[i][j]-=a[k][j] * t;
}
b[i] -= b[k] * t;
}
}
void Gauss()//高斯消元法
{
int i,j,k;
for(k = 1;k < n;k++)//共進行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 - 1;i>=1;i--)
{
for(j = i+1;j <=n ;j++)
{
b[i] -= a[i][j] * b [j];
}
x[i] = b[i];
}
}
void dis()
{
int i;
cout<<"解方程得:"<<endl;
for(i = 1;i<=n;i++)
{
cout<<"x"<<i<<" = ";
printf("%.5f\n",x[i]);
}
}
int main()
{
set();
Gauss();
dis();
system("pause");
return 0;
}
6. 用c語言編寫高斯-約當全主元消去法
#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 = 1;i <= n;i++)
{
for(j = 1;j<=n;j++)
{
cin>>a[i][j];//系數
}
cin>>b[i];//結果
}
return 0;
}
int find(int k)//尋找第k列主元
{
int i,tag = k;
double maxv=0;
for(i = k;i <= n;i++)
{
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 = 1;j <= n;j++)
{
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 = k; j <= n;j++)
{
a[k][j]/=temp;
}
b[k]/=temp;
}
void disME(int k)
{
int i,j;
for(i =1 ;i<=n;i++)
{
for(j = i;j<= n;j++)
{
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+1;i<= n;i++)
{
t = a[i][k]/a[k][k];
for(j = k;j <= n;j++)
{
a[i][j]-=a[k][j] * t;
}
b[i] -= b[k] * t;
}
}
void Gauss()//高斯消元法
{
int i,j,k;
for(k = 1;k < n;k++)//共進行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 - 1;i>=1;i--)
{
for(j = i+1;j <=n ;j++)
{
b[i] -= a[i][j] * b [j];
}
x[i] = b[i];
}
}
void dis()
{
int i;
cout<<"解方程得:"<<endl;
for(i = 1;i<=n;i++)
{
cout<<"x"<<i<<" = ";
printf("%.5f\n",x[i]);
}
}
int main()
{
set();
Gauss();
dis();
system("pause");
return 0;
}
———————————————————————————————
希望答案能幫到你,要是你有疑問可以追問
當然,點贊也是您的美德,謝謝
7. 高斯消去法 c語言
#include<stdio.h>
#define demension 4//修改數組的維數可以在這里改動
void transferM(double array[][demension])
//上三角
{
int row1,row2,col;
double m;
for(row1=0;row1<demension;row1++)
{
for(row2=row1+1;row2<demension;row2++)
{
m=array[row2][row1]/array[row1][row1];
for(col=row1;col<demension;col++)
{
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=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
printf("%6.2lf",a[i][j]);
}
printf("\n");
}
}
8. 誰有高斯消元法的程序用C語言實現的如果給我發一份,我會給他很高的懸賞分。
//這是C++的程序,用文件輸入輸出
#include<iostream.h>
#include<fstream.h>
#include<math.h>
#include<stdlib.h>
void init(double[100][100],int &);
void work(double[100][100],int);
void pr(double[100][100],int);
void main()
{
double x[100][100];
int n;
init(x,n);
work(x,n);
pr(x,n);
}
void init(double x[100][100],int &n)
{
ifstream infile;
infile.open("equations.in",ios::in);
infile>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n+1;j++)
infile>>x[i][j];
infile.close();
}
void work(double x[100][100],int n)
{
int q[100],p,i,j,k;
double min,l;
for(i=0;i<n;i++)
q[i]=0;
for(k=0;k<n;k++)
{
p=-1;
min=10000;
for (i=0;i<n;i++)
if (!q[i] && x[i][k]!=0 && min-1e-10>fabs(x[i][k]))
{
min=fabs(x[i][k]);
p=i;
}
if (p==-1)
{
ofstream outfile;
outfile.open("equations.out",ios::out);
outfile<<"這個方程組無解或有無窮個解。"<<endl;
outfile.close();
exit(0);
}
else
q[p]=1;
for(i=0;i<n;i++)
if (i!=p)
{
l=x[i][k]/x[p][k];
for(j=0;j<n+1;j++)
x[i][j]=x[i][j]-l*x[p][j];
}
}
}
void pr(double x[100][100],int n)
{
ofstream outfile;
outfile.open("equations.out",ios::out);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if (fabs(x[i][j])>1e-10)
{
outfile<<"x["<<i+1<<"]="<<x[i][n]/x[i][j]<<endl;
break;
}
outfile.close();
}
9. c語言用高斯消元法解這個方程
高斯消元法適合求解線性方程組,沒見過可以求解高次方程組的代碼(說法)。
10. 用C語言寫一個高斯消元法解方程組的程序
我們以方程組
2x1
+
6x2
-
x3
=
-12
5x1
-
x2
+2x3
=
29
-3x1
-
4x2
+
x3
=
5
為例
來說明樓主自己把方程組化為矩陣形式。以下為源代碼
。
#include
#include
#include
#include
int
GS(int,double**,double
*,double);
double
**TwoArrayAlloc(int,int);
void
TwoArrayFree(double
**);
int
main(void)
{
int
i,n;
double
ep,**a,*b;
n
=
3;
ep
=
1e-4;
a
=
TwoArrayAlloc(n,n);
b
=
(double
*)calloc(n,sizeof(double));
if(b
==
NULL)
{
printf("memory
get
error\n");
exit(1);
}
a[0][0]=
2;
a[0][1]=
6;
a[0][2]=
-1;
a[1][0]=
5;
a[1][1]=-1;
a[1][2]=
2;
a[2][0]=-3;
a[2][1]=-4;
a[2][2]=
1;
b[0]
=
-12;
b[1]
=
29;
b[2]
=
5;
if(!GS(n,a,b,ep))
{
printf("can't
solve
it
with
GS
elimination\n");
exit(0);
}
printf("The
solution
of
equations
is
as
follows:\n");
for(i=0;i<3;i++)
{
printf("x%d
=
%.2f\n",i,b[i]);
}
TwoArrayFree(a);
free(b);
return
0;
}
int
GS(n,a,b,ep)
int
n;
double
**a;
double
*b;
double
ep;
{
int
i,j,k,l;
double
t;
for(k=1;k<=n;k++)
{
for(l=k;l<=n;l++)
if(fabs(a[l-1][k-1])>ep)
break;
else
if(l==n)
return(0);
if(l!=k)
{
for(j=k;j<=n;j++)
{
t
=
a[k-1][j-1];
a[k-1][j-1]
=a[l-1][j-1];
a[l-1][j-1]
=t;
}
t=b[k-1];
b[k-1]=b[l-1];
b[l-1]=t;
}
t=1/a[k-1][k-1];
for(j=k+1;j<=n;j++)
a[k-1][j-1]=t*a[k-1][j-1];
b[k-1]*=t;
for(i=k+1;i<=n;i++)
{
for(j=k+1;j<=n;j++)
a[i-1][j-1]-=a[i-1][k-1]*a[k-1][j-1];
b[i-1]-=a[i-1][k-1]*b[k-1];
}
}
for(i=n-1;i>=1;i--)
for(j=i+1;j<=n;j++)
b[i-1]-=a[i-1][j-1]*b[j-1];
return(1);
}
double
**TwoArrayAlloc(int
r,int
c)
{
double
*x,**y;
int
n;
x=(double
*)calloc(r*c,sizeof(double));
y=(double
**)calloc(r,sizeof(double*));
for(n=0;n<=r-1;++n)
{
y[n]=&x[c*n];
}
return
y
;
}
void
TwoArrayFree(double
**x)
{
free(x[0]);
free(x);
}