c语言解线性方程
Ⅰ c语言程序解线性方程组
给,下面的代码已经编译运行确认,肯定好用了,试试吧:)
#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();}
}
}
Ⅱ 用C语言编写线性方程组数值解法程序
题目就不懂……高斯消元倒是简单
Ⅲ 模拟退火算法解一般线性方程的C语言程序
好奇怪的问题,解一般线性方程用模拟退火算法做??!!是规划问题还是什么?解一般线性方程应该看线性代数的,用模拟退火算法干什么。虽然我做过模拟退火算法的C语言实现
Ⅳ 用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
Ⅳ C语言程序设计:线性方程组求解
程序能成功运行,用的高斯消元法
不过没有给出菜单
输入提示信息比较清楚
某次的结果如下:
你要解几元线性方程组:
2
请输入第1行相应的系数:
a[0][0]: 2
a[0][1]: -1
请输入第1行相应的常数:
b[0]: 3
请输入第2行相应的系数:
a[1][0]: 1
a[1][1]: 1
请输入第2行相应的常数:
b[1]: 9
方程组:
2.000000X1 - X2= 3.000000
X1 + X2= 9.000000
该方程组的解为:
x1 = 4.00
x2 = 5.00
Press any key to continue
程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
int GS(int,double**,double *,double);
double **TwoArrayAlloc(int,int);
void TwoArrayFree(double **);
void main()
{
int i,j,n;
double ep,**a,*b;
ep = 1e-4;
printf("你要解几元线性方程组:\n");
scanf("%d",&n);
a = TwoArrayAlloc(n,n);
b = (double *)calloc(n,sizeof(double));
if(b == NULL)
{
printf("内存分配失败\n");
exit(1);
}
for(i=0;i<n;i++)
{
printf("请输入第%d行相应的系数:\n",i+1);
for(j=0;j<n;j++)
{
printf("a[%d][%d]: ",i,j);
scanf("%lf",a[i]+j);
fflush(stdin);
}
printf("请输入第%d行相应的常数:\n",i+1);
printf("b[%d]: ",i);
scanf("%lf",b+i);
fflush(stdin);
}
printf("方程组:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]>0)
{
if(j>0)printf(" + ");
if(a[i][j]!=1)
printf("%lfX%d",a[i][j],j+1);
else
printf("X%d",j+1);
}
if(a[i][j]<0)
{
if(j>0)printf(" - ");
if(a[i][j]!=-1)
printf("%lfX%d",fabs(a[i][j]),j+1);
else
printf("X%d",j+1);
}
}
printf("= %lf\n",b[i]);
}
if(!GS(n,a,b,ep))
{
printf("不可以用高斯消去法求解\n");
exit(0);
}
printf("该方程组的解为:\n");
for(i=0;i<n;i++)
printf("x%d = %.2f\n",i+1,b[i]);
TwoArrayFree(a);
free(b);
}
int GS(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*));
if(!x||!y)
{
printf("内存分配失败\n");
exit(1);
}
for(n=0;n<=r-1;++n)
y[n]=&x[c*n];
return (y);
}
void TwoArrayFree(double **x)
{
free(x[0]);
free(x);
}
Ⅵ C语言 解线性方程
我有列主元消的;
#include<stdio.h>
#include<math.h>
void main()
{
float a[4][4]={{1.003,0.333,1.504,-0.333},{-2.011,1.455,0.506,2.956},{4.329,-1.952,0.006,2.087},{5.113,-4.004,3.332,-1.112}};
float b[4]={3.005,5.407,0.136,3.772};
float c,d;
int i,j,k,s,p,l;
for(j=0;j<4;j++ )
{
for(i=j;i<4;i++)
{
k=i;
for(s=i+1;s<4;s++)
{
if(fabs(a[s][j])>fabs(a[k][j]))
k=s;
}
for(p=0;p<4;p++)
{
c=a[i][p];
a[i][p]=a[k][p];
a[k][p]=c;
}
c=b[i];
b[i]=b[k];
b[k]=c;
}
}
for(s=0;s<4;s++)
{
for(p=0;p<4;p++)
printf("%f ",a[s][p]);
printf("%f\n",b[s]);
}
for(j=0;j<4;j++)
{
for(l=j+1;l<4;l++)
{
d=a[l][j]/a[j][j];
b[l]= b[l]-b[j]*d;
for(p=j;p<4;p++)
a[l][p]=a[l][p]-d*a[j][p];
}
}
printf("\n");
for(s=0;s<4;s++)
{
for(p=0;p<4;p++)
{
printf("%f ",a[s][p]);}
printf("%f\n",b[s]);
}
b[3]=b[3]/a[3][3];
for(i=2;i>=0;i--)
{
c=0;
for(j=i+1;j<4;j++)
c=b[j]*a[i][j]+c;
b[i]=(b[i]-c)/a[i][i];
}
printf("\n");
for(i=0;i<4;i++)
printf("%f ",b[i]);
}
Ⅶ 如何用C语言解决多元一次线性方程
用多重循环,遍历每个未知数的整数值(从0到9),当方程两边相等时,此时的所有循环变量值就是一组解。多元一次方程整数解有多个
Ⅷ 在C语言中怎么实现输入线性方程的功能
#include<stdio.h>
#include<math.h>
void main()
{
float x0,x1,x2,fx0,fx1,fx2;
do{
printf("please input x1&x2:");
scanf("%f,%f",&x1,&x2);
fx1=x1*x1*x1*x1*x1*x1-5*x1*x1*x1*x1*x1+3*x1*x1*x1*x1+x1*x1*x1-7*x1*x1+7*x1-20;
fx2=x2*x2*x2*x2*x2*x2-5*x2*x2*x2*x2*x2+3*x2*x2*x2*x2+x2*x2*x2-7*x2*x2+7*x2-20;
}while(fx1*fx2>0);
do
{
x0=(x1+x2)/2;
fx0=x0*x0*x0*x0*x0*x0-5*x0*x0*x0*x0*x0+3*x0*x0*x0*x0+x0*x0*x0-7*x0*x0+7*x0-20;
if((fx0*fx1)>0)
{
fx1=fx0;
x1=x0;
}
else
{
fx2=fx0;
x2=x0;
}
}while(fabs(fx0)>=1e-6);
printf("%f",x0);
}
Ⅸ 有关C语言解线性方程组问题,求解。
看贴吧 或者私信我
Ⅹ c语言解线性方程组的编程题 【做的好会多给分】
以下算法的适用条件:A的各阶主子式不为零
另外还可以采用
直接法:
消元法:Gauss-Jordan消元法,
分解法:Dolittle分解 (我用的是Courant分解法),追赶法,对称正定矩阵的LDL‘分解
----------
迭代法:
Jacobi迭代
Gauss-Seidel迭代
松弛迭代
-----------------
你上网可以搜索一下,或者看看数值计算方面的书
OK, 你看看这个, 另外还加了注释 :
Courant分解算法:
aX = b, 作 A=LU, L是下三角矩阵, U是上三角矩阵
即L =
| L11
| L21 L22
| L31 L32 L33
| ..............
| Ln1 Ln2 ........Lnn
U =
| 1 U12 ..... U1n
| 空格 1 ..... U2n
| 空格 空格 ........
| 空格 空格 空格 空格 空格1
---------------------------------------------------
aX = b -----> LUX = b
记 UX = y,
由Ly = b得到
因为无法输出数学符号,以下采用[i, j]Ai 表示对Ai从i到j求和
yi = (bi - [j=1, i-1]Lij yj) / Lii i = 1, 2, ..., n
由UX = y得到
xi = yi - [j=i+1, n]uij xj j = n, n-1, ..., 2, 1
你在纸上验证一下就明白了
--------------------------------------------------------------
以下采用Courant分解 解 aX = b, 经检查,程序运行正确
这是运行结果:
--------------------------------------------------------------
Input n value(dim of Ax=b): 3
Now input the matrix a(i, j), i, j = 0, ..., 2:
1 2 1 -2 -1 -5 0 -1 6
Now input the matrix b(i), i = 0, ..., 2:
24 -63 50
Solve...x_i =
7.000000
4.000000
9.000000
--------------------------------------------------------------
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#define MAX_N 20
int main(int argc, char* argv[])
{
int n; // 未知数个数
int i, j, k;
static double a[MAX_N][MAX_N], b[MAX_N], x[MAX_N], y[MAX_N];
static double l[MAX_N][MAX_N], u[MAX_N][MAX_N];
printf("\nInput n value(dim of Ax=b): ");
scanf("%d", &n);
if(n >MAX_N)
{
printf("The input n is larger than MAX_N, please redefine the MAX_N.\n");
return 1;
}
if(n <= 0)
{
printf("Please input a number between 1 and %d.\n", MAX_N);
return 1;
}
// {{ 程序输入
printf("Now input the matrix a(i, j), i, j = 0, ..., %d:\n", n-1);
for (i=0; i<n; i++)
for (j=0; j<n; j++)
scanf("%lf", &a[i][j]);
printf("Now input the matrix b(i), i = 0, ..., %d:\n", n-1);
for(i=0; i<n; i++)
scanf("%lf", &b[i]);
// }} 程序输入
for(i=0; i<n; i++)
u[i][i] = 1; //
for(k=0; k<n; k++)
{
for(i=k; i<n; i++) // 计算L的第k列元素
{
l[i][k] = a[i][k];
for(j=0; j<=k-1; j++)
l[i][k] -= (l[i][j]*u[j][k]);
}
for(j=k+1; j<n; j++) //计算U的第k行元素
{
u[k][j] = a[k][j];
for(i=0; i<=k-1; i++)
u[k][j] -= (l[k][i]*u[i][j]);
u[k][j] /= l[k][k];
}
}
for(i=0; i<n; i++) // 解Ly = b
{
y[i] = b[i];
for(j=0; j<=i-1; j++)
y[i] -= (l[i][j]*y[j]);
y[i] /= l[i][i];
}
for(i=n-1; i>=0; i--) // 解UX = Y
{
x[i]=y[i];
for(j=i+1; j<n; j++)
x[i] -= (u[i][j]*x[j]);
}
printf("Solve...x_i = \n"); // 输出结果
for(i=0; i<n; i++)
printf("%f\n", x[i]);
return 0;
}