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);
}