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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c语言编程求线性方程组的解相关的知识,希望对你有一定的参考价值。

例如 A={1 1}B={1} 求 AX=B的 x的解
1 2 2

在线等
答的对有加分。加分不低于30分哦

#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");
参考技术A 给,下面的代码已经编译运行确认,肯定好用了,试试吧:)
#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();

参考技术B 可以用列主元素高斯消去法做。
你去搜一下吧,算法不麻烦,但是我也懒的写了。。
参考技术C 对于我这种不懂的人来说 这个 很难~~~

用switch语句编写求一元二次方程的解的方程

#include "math.h"
#include "stdio.h"
main()

double a,b,c,d,flag,x1,x2,p,q;
printf("输入方程的三个系数a,b,c=?");
scanf("%f,%f,%f",&a,&b,&c);
d=b*b-4*a*c;
if(fabs(a)<=1.0e-6) flag=1;
else if(fabs(d)<=1.0e-6) flag=2;
else if(d>1.0e-6) flag=3;
else flag=4;
switch(flag)

case 1:printf("方程不是一个二次方程。\n");
break;
case 2:printf("方程有两个相等的实数根: \n x1,x2=%f\n",x1,x2);
break;
case 3:x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
printf("方程有两个不相等的实数根: \n x1,x2=%f\n",x1,x2);
break;
case 4:
p=-b/(2*a);
q=sqrt(-d)/(2*a);
printf("方程有两个共轭复数: \n");
printf("x1=%f + %f \n",p,q);
printf("x1=%f - %f \n",p,q);
break;


错在那里

正确代码为:#include "math.h"
#include "stdio.h"int main(void)

double a,b,c,d,x1,x2,p,q;
int flag;

printf("输入方程的三个系数a,b,c=?");
scanf("%lf,%lf,%lf", &a, &b, &c);

d = b * b - 4 * a * c;

if(fabs(a) <= 1.0e-6)

flag=1;

else if(fabs(d) <= 1.0e-6)

flag=2;

else if(d > 1.0e-6)

flag=3;

else

flag=4;


switch(flag)

case 1:

printf("方程不是一个二次方程。\n");

break;

case 2:

x1 = (-b + sqrt(d)) / (2 * a);
x2 = x1;

printf("方程有两个相等的实数根: \n x1 = x2 = %lf\n", x1);

break;

case 3:

x1 = (-b + sqrt(d)) / (2 * a);
x2 = (-b - sqrt(d)) / (2 * a);

printf("方程有两个不相等的实数根: \nx1 = %lf\nx2 = %lf\n",x1,x2);

break;

case 4:

p = -b / (2 * a);
q = sqrt(-d) / (2 * a);

printf("方程有两个共轭复数: \n");
printf("x1 = %lf + %lf \n", p, q);
printf("x1 = %lf - %lf \n", p, q);

break;



return 0;
注:由于时间关系,注释就没写了,建议回去再看一下switch的运用。愿能解决你的问题,编译一下吧!祝你好运。
参考技术A scanf("%f,%f,%f",&a,&b,&c);改为scanf("%lf,%lf,%lf",&a,&b,&c);double型输入用%lf格式符
变量flag类型变为int;传递给switch()的值必须是有最终结果的整型变量或表达式
将double a,b,c,d,flag,x1,x2,p,q;改为下面两行:
double a,b,c,d,x1,x2,p,q;
int flag;
输入a,b,c时不要忘记中间的“,”。

以上是关于用c语言编程求线性方程组的解的主要内容,如果未能解决你的问题,请参考以下文章

c语言解线性方程组的编程题 【做的好会多给分】

C语言二分法计算非线性方程的解

非齐次线性方程组有唯一解怎么求

紧急求助:matlab求解唯一解的齐次线性方程组

线性方程组求解——C语言程序设计代码,高手们,拜托啦!急急急啊!!!

求指教:Python怎样分别输出方程组的解?