求助n元一次方程的算法

fanhongwei 2004-11-21 02:40:59
x1+x2+……xn=y
x1*a1+x2*a2+……+xn*an=z
已知a1,a2,……an,y,z为常数,且x1<x2<……<xn,求x1,x2,……,xn的值。
...全文
273 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jp1984 2005-03-28
可对这特殊情况的n元一次方程GAUSS消元,可作出结论。
如果求指定范围内x1,x2...xn的解,可暴力求解。
正如楼上所说通常情况下 该方程组 有无穷组解
回复
newmeteor 2005-03-28
向量 (a1,
a2,
. *(x1,x2,....,xn) =z
.
an
)
x1+x2....+xn =y;
回复
超级大笨狼 2004-12-10
http://superdullwolf.cnzone.net/Function.html
回复
超级大笨狼 2004-12-02
/*GAUSS1.08最终版*/
/*只允许处理实系数方阵方程*/

#include <math.h>
#include <stdio.h>
#define M 10 /*系数矩阵的规模*/
main()
{
/*******************************以下是全局变量定义区***************************************************/


float a[M][M]={{0}},b[M]={0},x[M]={0.0},y[M]={0.0},com,cen;/*com是主元素.为什么无法设为DOUBLE??*/


/*******************************以上是全局变量定义区***************************************************/

/*******************************以下是局部变量定义区***************************************************/



int i,j,k,m=100,n,key=0,p,q,xor[M],restart=1,min; /*i、m是方程数和行数,j、n是未知数数和列数,p,q是主元素的行、列下标,key是重新输入开关和中间变量*/

for(i=0;i<M;i++) xor[i]=i;


/*********************************以上是局部变量定义区***************************************************/
/********************************************************************************************************/
/*******************************以下是变量输入区*********************************************************/

while(restart==1)
{key=0;
while(key==0)
{
printf("\nProgram start!\n\n\nEnter the number of x n,take care that 1<=n<=%d:",M);
scanf("%d",&n);
printf("How many equations in the question?Enter it:");
scanf("%d",&m);
min=(m>n?n:m);
/*这里规定系数矩阵为方阵*/
for(i=0;i<m;i++)
{printf("Input %d quotions of x[i] in No.%2d equation:\n",n,i+1);
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
printf("Input b[%2d]:",i+1);
scanf("%f",&b[i]);
}
printf("Enter complete!\nYour equations' quotion are:\n****************************************************************\n");
for(j=0;j<n;j++)
printf(" x%2d ",j+1);
printf("= b \n");
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
printf("%9.5f ",a[i][j]);
printf(" %9.5f\n",b[i]);
}
printf("****************************************************************\nAre they correct?Yes enter 1;No enter 0 to input again:");
scanf("%d",&key);
restart=0;
}
/*********************************以上是变量输入区***************************************************/


/*********************************以下是高斯消去区***************************************************/
/*先找主元素,再消去*/
for(k=0;k<min;k++)
{com=a[k][k];p=k;q=k;
for(i=k;i<m;i++)
for(j=k;j<n;j++)
if(a[i][j]>com)
{com=a[i][j];p=i;q=j;}
/*主元素是com,它的行下标和列下标是p q*/
for(j=0;j<n;j++)
{cen=a[k][j];a[k][j]=a[p][j];a[p][j]=cen;}
cen=b[k];b[k]=b[p];b[p]=cen;
for(i=0;i<m;i++)
{cen=a[i][k];a[i][k]=a[i][q];a[i][q]=cen;}
key=xor[k];xor[k]=xor[q];xor[q]=key;
/*主元选取完毕。XOR已经交换。以下是高斯消去*/
for(i=k+1;(i<m&&com!=0);i++)
{cen=-a[i][k]/a[k][k];
for(j=k;j<n;j++)
a[i][j]=a[i][j]+cen*a[k][j];
b[i]=b[i]+cen*b[k];
}
/*高斯消去完成!*/
}

/**/printf("Enter complete!\nYour equations' quotion are:\n");
for(j=0;j<n;j++)
printf(" x%2d ",j+1);
printf(" b \n");
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
printf("%9.5f ",a[i][j]);
printf(" %9.5f\n",b[i]);
}/*检验完成!*/


/*********************************以上是高斯消去区***************************************************/
/*********************************以下是结果检验区***************************************************/
key=1;

for(i=0;i<n;i++)
{cen=0.0;
for(j=0;j<n;j++)
cen=cen+fabs(a[i][j]);
if(fabs(cen)<0.00001&&fabs(b[i])<0.00001)
{key=0;
break;
}
else if(fabs(cen)<0.00001&&fabs(b[i])>0.00001)
{key=-1;
break;
}
}
if(key==0)
{printf("\nThe equations have infinit answer groups because some of the equations you entered are invalid.\nDo you want to enter the equations again?\nEnter 1 to enter again;enter 0 to exit:");
scanf("%d",&restart);
}
else if(key==-1)
{printf("\nThe equations have no answer group because some of the equations you entered are contradictory.\nDo you want to enter the equations again?\nEnter 1 to enter again;enter 0 to exit:");
scanf("%d",&restart);
}
}
if(key==1)
{


/*********************************以上是结果检验区***************************************************/
/*********************************以下是回代求解区***************************************************/
for(k=n-1;k>=0;k--)
{cen=0;
for(j=m-1;j>k;j--)
cen=cen+y[j]*a[k][j];
y[k]=(b[k]-cen)/a[k][k];
}
for(i=0;i<n;i++)
x[xor[i]]=y[i];


/*********************************以上是回代求解区***************************************************/
/*********************************以下是结果输出区***************************************************/
for(i=0;i<n;i++)
printf("x%2d=%9.5f\n",i+1,x[i]);
restart=0;key=0;
/*********************************以上是结果输出区***************************************************/
/*********************************以下是结果检验区***************************************************/

}



/*********************************以上是结果检验区***************************************************/




}
回复
pierrexqw 2004-12-01
应该还有个优化目标吧?
回复
Tranquillo 2004-11-23
n个未知数,两个方程,只能得到其中两个未知数关于其他n-2个未知数的表达式,解出来又有什么用?
回复
xiaoxiaofei 2004-11-23
条件不够!!有无穷多解.
是不是还要限定xi为正整数?
或者你说的不是一个方程,而是一个方程组?
高等代数里面的求解方法:
此方程组(含有两个方程)的基础解系构成了一个n-2维空间,空间内部的所有向量都是方程组的解----有无穷个!
回复
51flyou 2004-11-22
如果a1、a2、……、an不全为零,则该方程组有n-2个自由求知数

为了使x1<x2<……<xn
可令
x1 = c+1
x2 = c+2
.
.
.
x(n-2) = c+(n-2)
这里已经可以保证x1<x2<……<x(n-2).

代入方程组可以用参数c和已知的a1,a2,……an,y,z表示出x(n-1)、xn

再通过条件x(n-2)<x(n-1)、x(n-1)<xn求出c

这样就可以求出满足条件x1<x2<……<xn的方程组的解
回复
galois_godel 2004-11-21
一般来说,无穷多解
回复
rickone 2004-11-21
把x3...xn随便赋一些升序的值,方程就能变成一个二元二次……

不对,有一个条件x1<x2<...<xn,不知道怎么做了……
回复
zzwu 2004-11-21
应有多个解。
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2004-11-21 02:40
社区公告
暂无公告