[求助]请各位朋友帮我看一下这个问题,想要解个简单的方程组,100分不多,送给能帮我解决的朋友,谢谢大家。
是这样子的,我想要解这个三元一次方程组,方程如下:
[252(60.5+3x+y-z)3(1.1-y+x)]/[(12.2-x)(25.4-x-y+z)(100+2x)2]=1584.9
[(0.59+y) (60.5+3x+y-z)]/[(1.1-y+x)(25.4-x-y+z)]=0.8
z=0.8(x+y+60.5)
需要解出x,y,z,请知道的大侠帮忙解决,多谢。
问题点数:0、回复次数:6Top
1 楼zhangfjj(小张)回复于 2004-04-02 23:50:07 得分 0
看看数学书呀,很多如高等代数,专门有介绍这类问题的算法Top
2 楼yiana1002(新的开始)回复于 2004-04-03 00:11:07 得分 0
楼主的方程是不是打错了几个符号啊
我怎么觉得好像不是三元一次方程Top
3 楼yiana1002(新的开始)回复于 2004-04-03 00:16:47 得分 0
我可以给你一些三元一次方程组的代码,
下面的数组均为三元一次方程组的矩阵
你要解其他的方程组只要改一下数字就行了
下面用的是列主元高斯消去法
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<math.h>
main()
{
int i;
float *x;
float c[3][4]={0.101,2.304,3.555,1.183,-1.347,3.712,4.623,2.137,-2.835,
1.072,5.643,3.035};
//12个数依次为A11,A12,A13,B1,A21,A22,A23,B2,A31,A32,A33,B3
float *ColPivot(float *,int);
x=ColPivot(c[0],3);
clrscr();
for(i=0;i<=2;i++)
printf("x[%d]=%f\n",i,x[i]);
getch();
}
float *ColPivot(float *c,int n)
{
int i,j,t,k;
float *x,p;
x=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-2;i++)
{
k=i;
for(j=i+1;j<=n-1;j++)
if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j;
if(k!=i)
for(j=i;j<=n;j++)
{
p=*(c+i*(n+1)+j);
*(c+i*(n+1)+j)=*(c+k*(n+1)+j);
*(c+k*(n+1)+j)=p;
}
for(j=i+1;j<=n-1;j++)
{
p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));
for(t=i;t<=n;t++)
*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));
}
}
for(i=n-1;i>=0;i--)
{
for(j=n-1;j>=i+1;j--)
(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));
x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));
}
return x;
}
雅可比迭代法
#include<alloc.h>
#include<math.h>
#define EPS 1e-6
#define MAX 100
float *Jacobi(float a[3][4],int n)
{
float *x,*y,epsilon,s;
int i,j,k=0;
x=(float *)malloc(n*sizeof(float));
y=(float *)malloc(n*sizeof(float));
for(i=0;i<n;i++)
x[i]=0;
while(1)
{
epsilon=0;
k++;
for(i=0;i<n;i++)
{
s=0;
for(j=0;j<n;j++)
{
if(j==i) continue;
s+=a[i][j]*x[j];
}
y[i]=(a[i][n]-s)/a[i][i];
epsilon+=fabs(y[i]-x[i]);
}
if(epsilon<EPS)
{
printf("迭代次数为:%d\n",k);
return y;
}
if(k>=MAX)
{
printf("THE method is disconvergent");
return y;
}
for(i=0;i<n;i++)
x[i]=y[i];
}
}
main()
{
int i;
float a[3][4]={5,2,1,8,2,8,-3,21,1,-3,-6,1};//数组的矩阵
float *x;
x=(float *)malloc(3*sizeof(float));
x=Jacobi(a,3);
clrscr();
for(i=0;i<3;i++)
printf("x[%d]=%f\n",i,x[i]);
getch();
}
高斯赛德尔迭代法
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<math.h>
#define N 100
float *GauseSeidel(float *a,int n)
{
int i,j,nu=0;
float *x,dx;
x=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-1;i++)
x[i]=0.0;
do
{
for(i=0;i<=n-1;i++)
{
float d=0.0;
for(j=0;j<=n-1;j++)
d+=*(a+i*(n+1)+j)*x[j];
dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));
x[i]+=dx;
}
if(nu>=N)
{
printf("迭代发散\n");
exit(1);
}
nu++;
}
while(fabs(dx)>1e-6);
return x;
}
main()
{
int i;
float *x;
float c[12]={5,2,1,8,2,8,-3,21,1,-3,-6,1};
float *GauseSeidel(float *,int);
x=GauseSeidel(c,3);
clrscr();
for(i=0;i<=2;i++)
printf("x[%d]=%f\n",i,x[i]);
getch();
}
Top
4 楼hab1980(秋艮)回复于 2004-04-03 01:18:18 得分 0
楼主:
你的第一个方程把分母移到右边,应该是一个三元三次方程吧,因为x的最高次幂是3。
很久没有碰数学了,不知道说得对否,不对莫怪Top
5 楼revealer(探索)回复于 2004-04-03 12:24:31 得分 0
谢谢两位,我正在看。Top
6 楼yiana1002(新的开始)回复于 2004-04-04 19:02:02 得分 0
如果楼主的方程不是三元一次方程的标准形式的话那就的,再加一个模块将其化为标准的三元一次方程Top




