用c语言编程求线性方程组的解

作者&投稿:謇雷 (若有异议请与网页底部的电邮联系)
C语言程序解线性方程组~

给,下面的代码已经编译运行确认,肯定好用了,试试吧:)

#include
#include
#include
#include
#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 k,i,j;
char celect;

system("cls");

printf("
用Gauss列主元消元法解线性方程组");
printf("
1.解方程组请按Enter.");
printf("
2.退出程式请按Esc.");
celect=getch();
if(celect==Esc)
exit(0);
printf("
输入方程组的维数:n=");
scanf("%d",&n);
printf("
现在输入系数矩阵A和向量b:");
for(i=1;i<=n;i++)
{
printf("
请输入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("
此方程组不合法!");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("
x%d=%f",i,x[i]);
}
message();

getch();
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("
继续运算按 Enter ,退出程式按 Esc!");
switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("
不合法的输入!");message();}
}
}

给,下面的代码已经编译运行确认,肯定好用了,试试吧:)


#include
#include
#include
#include
#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 k,i,j;
char celect;

system("cls");

printf("
用Gauss列主元消元法解线性方程组");
printf("
1.解方程组请按Enter.");
printf("
2.退出程式请按Esc.");
celect=getch();
if(celect==Esc)
exit(0);
printf("
输入方程组的维数:n=");
scanf("%d",&n);
printf("
现在输入系数矩阵A和向量b:");
for(i=1;i<=n;i++)
{
printf("
请输入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("
此方程组不合法!");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("
x%d=%f",i,x[i]);
}
message();

getch();
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("
继续运算按 Enter ,退出程式按 Esc!");
switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("
不合法的输入!");message();}
}
}

#include "stdlib.h"
#include "math.h"
#include "stdio.h"
int rgauss(n,a,b)
int n;
double a[],b[];
{ int *js,l,k,i,j,is,p,q;
double d,t;
js=malloc(n*sizeof(int));
l=1;
for (k=0;k<=n-2;k++)
{ d=0.0;
for (i=k;i<=n-1;i++)
for (j=k;j<=n-1;j++)
{ t=fabs(a[i*n+j]);
if (t>d) { d=t; js[k]=j; is=i;}
}
if (d+1.0==1.0) l=0;
else
{ if (js[k]!=k)
for (i=0;i<=n-1;i++)
{ p=i*n+k; q=i*n+js[k];
t=a[p]; a[p]=a[q]; a[q]=t;
}
if (is!=k)
{ for (j=k;j<=n-1;j++)
{ p=k*n+j; q=is*n+j;
t=a[p]; a[p]=a[q]; a[q]=t;
}
t=b[k]; b[k]=b[is]; b[is]=t;
}
}
if (l==0)
{ free(js); printf("fail\n");
return(0);
}
d=a[k*n+k];
for (j=k+1;j<=n-1;j++)
{ p=k*n+j; a[p]=a[p]/d;}
b[k]=b[k]/d;
for (i=k+1;i<=n-1;i++)
{ for (j=k+1;j<=n-1;j++)
{ p=i*n+j;
a[p]=a[p]-a[i*n+k]*a[k*n+j];
}
b[i]=b[i]-a[i*n+k]*b[k];
}
}
d=a[(n-1)*n+n-1];
if (fabs(d)+1.0==1.0)
{ free(js); printf("fail\n");
return(0);
}
b[n-1]=b[n-1]/d;
for (i=n-2;i>=0;i--)
{ t=0.0;
for (j=i+1;j<=n-1;j++)
t=t+a[i*n+j]*b[j];
b[i]=b[i]-t;
}
js[n-1]=n-1;
for (k=n-1;k>=0;k--)
if (js[k]!=k)
{ t=b[k]; b[k]=b[js[k]]; b[js[k]]=t;}
free(js);
return(1);
}

徐世良老师的.原地工作全选主元的高斯消元.用的符号有点诡异,而且将矩阵以线性表输入的.
我也写过一个,不过估计你不太喜欢用我的,这个用来解b也是矩阵的.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void swap(double *a,double *b){
double temp;
temp=*a;
*a=*b;
*b=temp;
}

void printMatrix(int n,int m,double **a){
int i,j;
for (i=0;i<n;i++){
for (j=0;j<m;j++) printf("%e\t",a[i][j]);
printf("\n");
}
}

int rgauss(int n,int m,double **a,double **b){//,double *det){
int *colex,rowex,s,i,j,k;
double d,t;
// *det=1;
s=0;
colex=malloc(n*sizeof(int));
for (k=0;k<n;k++){
d=0.0;
for (i=k;i<n;i++){
for (j=k;j<n;j++){
t=fabs(a[i][j]);
if (t>d){
d=t;
colex[k]=j;
rowex=i;
}
}
}
if (d+1.0==1.0){
free(colex);
printf("Singular Matrix!\n");
return 0;
}
else{
if (colex[k]!=k){
for (i=0;i<n;i++)
swap(a[i]+colex[k],a[i]+k);
s=s+colex[k]-k;
}
if (rowex!=k){
for (j=0;j<n;j++)
swap(a[rowex]+j,a[k]+j);
for (j=0;j<m;j++)
swap(b[rowex]+j,b[k]+j);
s=s+rowex-k;
}
}
d=a[k][k];
// *det=*det*d;
for (j=k+1;j<n;j++) a[k][j]/=d;
for (j=0;j<m;j++) b[k][j]/=d;
for (i=k+1;i<n;i++){
for (j=k+1;j<n;j++)
a[i][j]-=a[i][k]*a[k][j];
for (j=0;j<m;j++)
b[i][j]-=a[i][k]*b[k][j];
}
}

for (i=n-2;i>-1;i--)
for (j=i+1;j<n;j++)
for (k=0;k<m;k++)
b[i][k]-=a[i][j]*b[j][k];

colex[n-1]=n-1;

for (i=n-1;i>-1;i--)
if (colex[i]!=i)
for (j=0;j<m;j++) swap(b[colex[i]]+j,b[i]+j);

// if (s&1) *det=-*det;
return 1;
}

void main(){
#define N 2
#define M 1
double input_a[]={1,1,1,2};
double input_b[]={1,2};
double *a[N],*b[N];
int i;
for (i=0;i<N;i++){
a[i]=input_a+N*i;
b[i]=input_b+M*i;
}

rgauss(N,M,a,b);
printf("方程解为:\n");
printMatrix(N,M,b);
printf("\n");
}

给,下面的代码已经编译运行确认,肯定好用了,试试吧:)
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.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
k,i,j;
char
celect;
system("cls");
printf("\n用gauss列主元消元法解线性方程组");
printf("\n1.解方程组请按enter.");
printf("\n2.退出程式请按esc.");
celect=getch();
if(celect==esc)
exit(0);
printf("\n
输入方程组的维数:n=");
scanf("%d",&n);
printf("\n现在输入系数矩阵a和向量b:");
for(i=1;i<=n;i++)
{
printf("\n请输入a%d1--a%d%d系数和向量b%d:
\n",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此方程组不合法!");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("\nx%d=%f",i,x[i]);
}
message();
getch();
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
继续运算按
enter
,退出程式按
esc!");
switch(getch())
{
case
enter:
main();
case
esc:
exit(0);
default:{printf("\n不合法的输入!");message();}
}
}

可以用列主元素高斯消去法做。
你去搜一下吧,算法不麻烦,但是我也懒的写了。。

对于我这种不懂的人来说 这个 很难~~~


N元线性方程用C语言或C++,大家帮忙啊!!
” 孩子们有点怀疑传说的真实性了 于是他们又来到了实验室 水龙头打开了 白花花的水流了出来 “真没劲阿 我们白来了!” 刚开始的刺激感都消去了一半。 最后 他们来到了那个厕所 女孩子虽然口上说不相信 可是还是不敢进去 于是让刚刚很拽地说不怕的小C进去 看了表 1点整 2分钟后 男生出来了 ...

一个数据结构线性表方面的题,请用C语言编出来,并能实现,望有志者帮...
\/\/--- include <stdio.h> include <stdlib.h> define CF "%d\\t"typedef int datatype;typedef struct NODE{ datatype data;struct NODE *next;} node;node *mer(node *la,node *lb)\/*合并表*\/ { node *t1,*t2,*lrc,*lnew=NULL;if (la->data<=lb->data){ lnew=la;la=la->ne...

高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)
详情请查看视频回答

C语言如何计算简单的多元一次线性方程组
这个不是C++问题,转换成矩阵计算,算法可以参照http:\/\/zhidao.baidu.com\/link?url=0yw270bY37rjz3j4gpJbC-135qovZ2ZMwhkWc49SePoDQ66vk16R5n1p_DohYzTesLmEldg6zqtvIg6hiWN0YK

作业要求: 用c语言编写一个完整的程序,功能如下: 1,创建一个线性表,采...
include <stdio.h> include <malloc.h> define NULL 0 struct link{ int num;struct link *next;};struct link *creat(void){struct link *p1,*p2,*head;p1=(struct link *)malloc(sizeof(struct link));scanf("%d",&p1->num);head=p1;while(p1->num!=0)\/\/这里一定要以数字0结束,...

计算机二级C语言 考二级公共基础知识吗?
二级c语言笔试考公共基础知识.具体内容为:基本要求 1. 掌握算法的基本概念。2. 掌握基本数据结构及其操作。3. 掌握基本排序和查找算法。4. 掌握逐步求精的结构化程序设计方法。5. 掌握软件工程的基本方法,具有初步应用相关技术进行软件开发的能力。6. 掌握数据的基本知识,了解关系数据库的设计。考试内容...

c语言如何对若干离散点进行m阶多项式拟合
m阶多项式拟合,是算法问题,不是计算机语言问题。你先要有你的具体计算策略和方法,数值计算时,用计算机语言写出程序,算出结果。用 c 语言 或 fortran 语言 或别的语言,大同小异,没有原则差别。你先要定出你的方程形式,例如 y = a1*x^m+a2*x^(m-1)+...am a1,a2,...,am 是 m ...

fortran编程题 线性方程组求解问题
implicit none Subroutine GAUSS(A,B,N,X,L,js)dimension A(N,N),X(N),B(N),js(N)DOUBLE PRECISION A,B,X,T L=1 DO K=1,N-1 D=0.0 DO I=K,N DO J=K,N IF(ABS(A(I,J)).GT.D)THEN D=ABS(A(I,J))JS(K)=J IS=I ENDIF END DO IF(D+1.0.EQ.1.0)...

c语言求n元一次方程组的根的代码
的程序限 10 元 20 个方程的方程组。float b[200]; \/\/ 原来存放之间变量。printf("请输入方程组参数 \\n");for(j=0; j<n; j++)for(i=0; i<r+1; i++)scanf("%f", &a[j][i]);\/ for(j=0; j<n; j++) \/\/ 此段程序作为检测该程序正确性的试数作 用。{ for(i=0...

怎么用C语言解多元一次方程?需要得到最合适的解。
多元一次方程, 需要建方程组,解线性方程组得解。有几个变量就需要几个方程。解线性方程组的方法很多,例如高斯消去法。“最合适的解” -- 什么叫最合适,要用一个一个方程描述\/写出来。方程个数少于变量个数时得无穷个解。

榆次区17775577370: 用c语言编程求线性方程组的解 -
仪叶复方: #include "stdlib.h" #include "math.h" #include "stdio.h" int rgauss(n,a,b) int n; double a[],b[]; { int *js,l,k,i,j,is,p,q; double d,t; js=malloc(n*sizeof(int)); l=1; for (k=0;k<=n-2;k++) { d=0.0; for (i=k;i<=n-1;i++) for (j=k;j<=n-1;j++) { t=fabs(a[i*n+j]); if (t>d...

榆次区17775577370: C语言程序设计:线性方程组求解
仪叶复方: 程序能成功运行,用的高斯消元法 不过没有给出菜单 输入提示信息比较清楚 某次的结果如下: 你要解几元线性方程组: 2 请输入第1行相应的系数: a[0][0]: 2 a[0][1]: -1 请输入第1行相应的常数: b[0]: 3 请输入第2行相应的系数: a[1][0]: 1 a[1][1...

榆次区17775577370: C语言线性方程组求解 -
仪叶复方: 我今天写了一个,参考一下吧://作品:多元一次方程组的计算//作者:与你看日出//日期:2009年4月25日 星期六//说明:输出值只能是小数(最多六位),如x=1.876546//Han: 初始设的最多未知数的个数,运行程序后只能比它的个数小//hang...

榆次区17775577370: 求线性方程组C语言 -
仪叶复方: #include#include#include #include #define A(j,k) (*(A+(n+1)*j+k))#define B(j,k) (*(B+n*j+k)) int GS(double *A, double *result , int n) //编写高斯消去法求线性法 { double t; int i,j,k,tj; for(k=0;k {t=A(k,k); tj=k; for(j=k+1;j if(fabs(A(j,k))>fabs(t)){t=A(j,k);tj=j;} ...

榆次区17775577370: C语言程序解线性方程组 -
仪叶复方: 来,给你个LU分解法解方程的c程序#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#define N 20/*以下程序为不62616964757a686964616fe59b9ee7ad9431333264643062选主元的三角分解法(Doolittle)*/ main() ...

榆次区17775577370: 用C语言求解N阶线性矩阵方程Ax=b的简单解法 -
仪叶复方: 基础解系的求法(1)对A作行初等变换,化为最简阶梯形 (2)写出原方程组的同解方程组 (3)取定自由未知量,得基础解系 a.每个非零行中第一个非零系数所代表的变量是主元,共R(A)个,剩余的变量就是自由变量,共n-R(A)个; b.在最简阶梯形矩阵中找出秩为R(A)的行列式,那么其他各列的变量就是自由变量 3.其次线性方程组的解的判定 (1)AX=0只有零解:R(A)=n (2)AX=0有无穷多个非零解:R(A)=r<n A的列向量线性相关 特别的:n阶矩阵AX=0有无穷多个非零解,|A|=0 注意:若AB=0,则B的每一列都是AX=0的解 当B≠0时,意味着AX=0有非零解,进而R(B)≤n-R(A),R(A)+R(B)≤n

榆次区17775577370: 设计一个C程序,解线性方程组 -
仪叶复方: 原来的程序为:(那位朋友帮我改一下) #include "stdlib.h" #include "math.h" #include "stdio.h" #define MAX 255 int Guass(a,b,n) int n; double a[],b[]; { int *js,l,k,i,j,is,p,q; double d,t; js=malloc(n*sizeof(int)); l=1; for (k=0;k<=n-2;k++) { d=0.0...

榆次区17775577370: 雅克比迭代法求解线性方程组的C语言程序? -
仪叶复方:[答案] void Solve ( double dCoef [] ,double dY [] ,unsigned int iOrder ,double dErr){//用Jacobi迭代法解方程组,dCoef[]系数阵,Y[]向量,iOrder给出方程阶数,dErr给出精度\x05double res [Max];\x05//方程解\x05double ...

榆次区17775577370: 用高斯消去法求线性方程组,怎样用c语言编写? -
仪叶复方: #include<conio.h> #include<math.h> #include <stdio.h> #include <assert.h> #define A(j,k) (*(A+(n+1)*j+k)) #define B(j,k) (*(B+n*j+k)) int GS(double *A, double *result , int n) //编写高斯消去法求线性法 { double t;int i,j,k,tj;for(k=0;k<n-1;k++){t=A(k...

榆次区17775577370: 紧急求 LU分解法解线性方程组的 c/c++程序代码 -
仪叶复方: ipiv=(int *)calloc(n,sizeof(int)); a=(double **)malloc(n*sizeof(double)); a[0]=(double *)malloc(n*n*sizeof(double)); for (i=1;i<n;i++) a[i]=a[i-1]+n; b=(double *)calloc(n,sizeof(double));

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网