小生编了个数值程序,求教

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

小生编了个数值程序,求教

#1

帖子 jinjiachen » 2013-03-21 12:53

#include<stdio.h>
int main(void)
{
int i,max=1000;
float epsi=0.000001,x[3],y[3],a[4],b[4],c[4];
printf("形如a1x1+a2x2+a3x3=a4\n b1x1+b2x2+b3x3=b4\n c1x1+c2x2+c3x3=c4\n");
printf("请输入系数");
for(i=0;i<4;i++)
{
scanf("%f",&a);
}

for(i=0;i<4;i++)
{
scanf("%f",&b);
}

for(i=0;i<4;i++)
{
scanf("%f",&c);
}
for(i=0;i<3;i++)
{
scanf("%f",&x);
y=x;
}
for(i=1;i<=max;i++)
{
x[0]=-a[1]/a[0]*x[1]-a[2]/a[0]*x[2]+a[3]/a[0];
x[1]=-b[0]/b[1]*x[0]-b[2]/b[1]*x[2]+b[3]/b[1];
x[2]=-c[0]/c[2]*x[0]-c[1]/c[2]*x[1]+c[3]/c[2];
if((x[0]-y[0])<epsi&&(x[1]-y[1])<epsi&&(x[2]-y[2])<epsi)
printf("x1=%f x2=%f x3=%f ",x[0],x[1],x[2]);
else
{
for(i=0;i<3;i++)
y=x;
}
if(i==max)
printf("发散");
}
return(0);
}
以上是我用c编的一个三元一次方程组的数值解法,用的是高斯迭代,有些地方不够完善,有待改进,不过我现在的疑问是:
开头的几个循环是输入系数,不过我运行的时候一直让我输入,明明系数几经满了,还在让我输入。。。。
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: 小生编了个数值程序,求教

#2

帖子 jinjiachen » 2013-03-21 13:55

问题解决了,嘿嘿,我刚开始认为是程序的问题,原来是我写的程序不够好,导致运行出错,哈哈 :em04
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: 小生编了个数值程序,求教

#3

帖子 jinjiachen » 2013-03-21 17:44

#include<stdio.h>
int main(void)
{
int i,max=10;
float epsi=0.000001,x[3],y[3],a[4],b[4],c[4];
printf("形如a1x1+a2x2+a3x3=a4\n b1x1+b2x2+b3x3=b4\n c1x1+c2x2+c3x3=c4\n");
printf("请输入系数\n");
for(i=0;i<4;i++)
{
scanf("%f",&a);
}

for(i=0;i<4;i++)
{
scanf("%f",&b);
}

for(i=0;i<4;i++)
{
scanf("%f",&c);
}
printf("请赋初值");
for(i=0;i<3;i++)
{
scanf("%f",&x);
y=x;
}
printf("输入完毕,请等候\n");
for(i=1;i<max;i=i+1)
{
x[0]=-a[1]/a[0]*x[1]-a[2]/a[0]*x[2]+a[3]/a[0];
x[1]=-b[0]/b[1]*x[0]-b[2]/b[1]*x[2]+b[3]/b[1];
x[2]=-c[0]/c[2]*x[0]-c[1]/c[2]*x[1]+c[3]/c[2];
if((x[0]-y[0])<epsi&&(x[1]-y[1])<epsi&&(x[2]-y[2])<epsi)
{
printf("x1=%f x2=%f x3=%f \n",x[0],x[1],x[2]);
break;
}
else
{
for(i=0;i<3;i++)
y=x;
}
if(i==max)
{
printf("发散");
}
}
return(0);
}
改进了一下,收敛得方程可以显示解了,不过发散怎么也不行,改过很多次,但还是不行,各位大虾帮帮我 :em06
头像
b33e
帖子: 3864
注册时间: 2011-06-07 14:20
系统: Mint18

Re: 小生编了个数值程序,求教

#4

帖子 b33e » 2013-03-21 17:53

这东西,matlab搞定 :em04
Large_Windmill
帖子: 1
注册时间: 2013-03-20 17:08
系统: ubuntu

Re: 小生编了个数值程序,求教

#5

帖子 Large_Windmill » 2013-03-21 18:15

Matlab几句话搞定,比这好弄多。 :em05
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: 小生编了个数值程序,求教

#6

帖子 月下叹逍遥 » 2013-03-21 18:41

建议使用牛顿下山迭代,用C大才小用了。。。
浮生七十今三十,从此凄惶未可知
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: 小生编了个数值程序,求教

#7

帖子 jinjiachen » 2013-03-21 20:51

b33e 写了:这东西,matlab搞定 :em04
嗯嗯,我知道那东西强,不过我的目的并不是要解方程,一是对计算方法的理解,二是对c的训练 :em09
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: 小生编了个数值程序,求教

#8

帖子 jinjiachen » 2013-03-21 20:54

月下叹逍遥 写了:建议使用牛顿下山迭代,用C大才小用了。。。
牛顿下山要求导,通用性不好,我只是想自己编程实现一些常用算法,你能帮帮我看下哪里不足吗?我的现在的问题是:收敛的方程可以输出解,发散的就一直在算,不能输出“发散”,我觉得好像逻辑没有错啊 :em20
头像
lainme
论坛版主
帖子: 7805
注册时间: 2008-09-13 19:17
系统: Arch Linux (x86_64)
联系:

Re: 小生编了个数值程序,求教

#9

帖子 lainme » 2013-03-21 21:43

for(i=0;i<3;i++)
y=x;

指标重复了吧

目测 if (i==max) 这段要放到那个 for 循环外边。缩进一下就看出来了。
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: 小生编了个数值程序,求教

#10

帖子 jinjiachen » 2013-03-21 21:52

lainme 写了:for(i=0;i<3;i++)
y=x;

指标重复了吧

目测 if (i==max) 这段要放到那个 for 循环外边。缩进一下就看出来了。

对哦,i重复了,我去修改下试试,谢谢 :em11
回复