发布网友 发布时间:2022-04-25 14:38
共5个回答
热心网友 时间:2023-10-09 12:02
给,下面的代码已经编译运行确认,肯定好用了,试试吧:)
#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();}
}
}
热心网友 时间:2023-10-09 12:02
我今天写了一个,参考一下吧:
//作品:多元一次方程组的计算
//作者:与你看日出
//日期:2009年4月25日 星期六
//说明:输出值只能是小数(最多六位),如x=1.876546
//Han: 初始设的最多未知数的个数,运行程序后只能比它的个数小
//hang:计算中途中自己改变的未知数的个数
//JUZHEN:初始的示例矩阵
#include <stdio.h>
#include <math.h>
#define Han 200//(可自设)多元一次方程组有n行n+1列(多的一列是等号右边的值),给出行数就能确定矩阵,
#define JUZHEN {1,1,1,1,5},{1,2,-1,4,-2},{2,-3,-1,-5,-2},{3,1,2,11,0}//示例一个
main()
{
int i,j,k,m,n,t,cf,hang=4;
float temp;
float AA[Han][Han+1]={JUZHEN};//定义所要计算的数组
do//判断是否重试
{
for(i=0;i<hang;i++)//输出所定义的数组
{
printf("\n");
for(j=0;j<hang+1;j++)
{
printf("%g\t",AA[i][j]);
}
}
printf("\n");
printf("是否自己输入?是:1;否:0");
scanf("%d",&t);
if(t==1)//判断是否自己输入数组
{
printf("输入未知数的个数");
scanf("%d",&hang);
for(i=0;i<hang;i++)//输入所定义的数组
{
for(j=0;j<hang+1;j++)
{
printf("第%d行第%d列的数为:",i+1,j+1);
scanf("%f",&AA[i][j]);
}
}
}
for(k=0;k<hang;k++)//这个大循环将数组的左下角转化为0
{
while(AA[k][k]==0)//如果第K行K列的那个数为0,则加和重组一行。
{
for(m=k+1;m<hang;m++)
for(n=k;n<hang+1;n++)
{
AA[k][n]+=AA[m][n];
}
}
for(i=k;i<hang;i++)//将第K列下面变为1
{
temp=AA[i][k];
for(j=k;j<hang+1;j++)//将每列变为1
{
AA[i][j]/=temp;
}
}
for(i=k+1;i<hang;i++)//将下面的数列与上面的数列相减使其下面为0
{
for(j=0;j<hang+1;j++)
{
AA[i][j]-=AA[k][j];
}
}
}
for(k=hang-2;k>=0;k--)//这个大循环将数组的右上角转化为0
{
for(i=k+1;i<hang+1-1;i++)//将第i列上面变为0
{
AA[k][hang+1-1]-=AA[k][i]*AA[i][hang+1-1];
AA[k][i]=0;
}
}
for(i=0;i<hang;i++)//输出该矩阵(也就是多元一次方程组)的解
{
printf("\n");
for(j=0;j<hang+1;j++)
{
printf("%g\t",AA[i][j]);
}
}
printf("\n未知数的值为:\n");
for(i=0;i<hang;i++)//输出该矩阵(也就是多元一次方程组)的解
{
printf("x(%d)=\t%g\n",i+1,AA[i][hang+1-1]);
}
printf("\n");
printf("是否再试一次?是:1;否:0");
scanf("%d",&cf);
}
while(cf==1);//判断是否重试
}
热心网友 时间:2023-10-09 12:03
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define N 20
/*以下程序为不选主元的三角分解法(Doolittle)*/
main()
{
int i,j,k,s;
float a[N][N]={0},L[N][N]={0},U[N][N]={0},sigma1,sigma2,b[N],y[N],x[N];
/*为L主对角线元素赋1*/
for(i=0;i<N;i++)
{
L[i][i]=1;
}
/*输入矩阵a*/
for(i=0;i<N;i++)
{
printf("请输入矩阵第%d行元素:\n",i+1);
for(j=0;j<N;j++)
scanf("%f",&a[i][j]);
}
/*计算U第一行的元素和L第一列的元素*/
for(i=0;i<N;i++)
{
U[0][i]=a[0][i];
L[i][0]=a[i][0]/U[0][0];
}
for(k=1;k<N;k++)
{
/*计算矩阵U*/
for(j=k;j<N;j++)
{
sigma1=0;
for(s=0;s<=k-1;s++)
sigma1+=L[k][s]*U[s][j];
U[k][j]=a[k][j]-sigma1;
}
/*计算矩阵L*/
for(i=k;i<N;i++)
{
sigma2=0;
for(s=0;s<=k-1;s++)
sigma2+=L[i][s]*U[s][k];
L[i][k]=(a[i][k]-sigma2)/U[k][k];
}
}
/*输出矩阵L、U*/
printf("a矩阵为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%5.1f ",a[i][j]);
printf("\n");
}
printf("L矩阵为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%5.1f ",L[i][j]);
printf("\n");
}
printf("U矩阵为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%5.1f ",U[i][j]);
printf("\n");
}
printf("请输入b矩阵\n",i+1);
for(i=0;i<N;i++)
scanf("%f",&b[i]);
/*回代法求解方程组Ly=b*/
for(i=0;i<N;i++)
{
sigma1=0;
for(k=0;k<=i-1;k++)
sigma1+=L[i][k]*y[k];
y[i]=b[i]-sigma1;
}
for(i=N-1;i>=0;i--)
{
sigma2=0;
for(k=i+1;k<N;k++)
sigma2+=U[i][k]*x[k];
x[i]=(y[i]-sigma2)/U[i][i];
}
printf("x为:\n");
for(i=0;i<N;i++)
printf("%5.1f ",x[i]);
printf("\n");
}
热心网友 时间:2023-10-09 12:03
来,给你个LU分解法解方程的c程序
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define N 20
/*以下程序为不选主元的三角分解法(Doolittle)*/
main()
{
int i,j,k,s;
float a[N][N]={0},L[N][N]={0},U[N][N]={0},sigma1,sigma2,b[N],y[N],x[N];
/*为L主对角线元素赋1*/
for(i=0;i<N;i++)
{
L[i][i]=1;
}
/*输入矩阵a*/
for(i=0;i<N;i++)
{
printf("请输入矩阵第%d行元素:\n",i+1);
for(j=0;j<N;j++)
scanf("%f",&a[i][j]);
}
/*计算U第一行的元素和L第一列的元素*/
for(i=0;i<N;i++)
{
U[0][i]=a[0][i];
L[i][0]=a[i][0]/U[0][0];
}
for(k=1;k<N;k++)
{
/*计算矩阵U*/
for(j=k;j<N;j++)
{
sigma1=0;
for(s=0;s<=k-1;s++)
sigma1+=L[k][s]*U[s][j];
U[k][j]=a[k][j]-sigma1;
}
/*计算矩阵L*/
for(i=k;i<N;i++)
{
sigma2=0;
for(s=0;s<=k-1;s++)
sigma2+=L[i][s]*U[s][k];
L[i][k]=(a[i][k]-sigma2)/U[k][k];
}
}
/*输出矩阵L、U*/
printf("a矩阵为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%5.1f ",a[i][j]);
printf("\n");
}
printf("L矩阵为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%5.1f ",L[i][j]);
printf("\n");
}
printf("U矩阵为:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%5.1f ",U[i][j]);
printf("\n");
}
printf("请输入b矩阵\n",i+1);
for(i=0;i<N;i++)
scanf("%f",&b[i]);
/*回代法求解方程组Ly=b*/
for(i=0;i<N;i++)
{
sigma1=0;
for(k=0;k<=i-1;k++)
sigma1+=L[i][k]*y[k];
y[i]=b[i]-sigma1;
}
for(i=N-1;i>=0;i--)
{
sigma2=0;
for(k=i+1;k<N;k++)
sigma2+=U[i][k]*x[k];
x[i]=(y[i]-sigma2)/U[i][i];
}
printf("x为:\n");
for(i=0;i<N;i++)
printf("%5.1f ",x[i]);
printf("\n");
}追问a[i][j]中包括常数项么
追答不包括,运行之后根据提示来就行。其实可以再matlab里边直接用A矩阵的逆矩阵,左乘b矩阵,就得出结果。方法是先定义好A(10*10)矩阵,定义好b(10*1)矩阵,命令inv(A)*b得到结果
热心网友 时间:2023-10-09 12:04
/*
Input a liner system with exactly one solution.
Work out the roots using elimination
Example Input:
2
1 1 2
1 -1 0
(x1 + x2 == 2, x1 - x2 == 0)
Output:
x1 = 1.000000
x2 = 1.000000
which are the solution
*/
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn = 100;
const double eps = 1e-8;
double a[maxn][maxn],b[maxn];
int n;
void getinfo()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
scanf("%lf",&a[i][j]);
scanf("%lf",&b[i]);
}
}
void process()
{
for(int i=0;i<n;i++)
{
int p = -1;
for(int j=i;j<n && p==-1;j++)
if(fabs(a[j][i])>eps)
p = j;
if(p==-1)
{
printf("Cannot determine the roots.\n");
return;
}
for(int j=i;j<n;j++) swap(a[i][j],a[p][j]);
swap(b[i],b[p]);
for(int j=0;j<n;j++)
if(j!=i && fabs(a[j][i])>eps)
{
double u = -a[j][i] / a[i][i];
for(int k=0;k<n;k++)
a[j][k] += a[i][k] * u;
b[j] += b[i] * u;
}
}
for(int i=0;i<n;i++) printf("x%d = %lf\n",i,b[i]/a[i][i]);
}
int main()
{
getinfo();
process();
return 0;
}