标题:[求助]请教迭代法的问题
只看楼主
guiban
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-3-31
 问题点数:0 回复次数:5 
[求助]请教迭代法的问题

小弟要编个程序来解一个句包含积分的方程,
想用迭代法.然而不知为何结果总是死循环,但就是得不到所要的数,
请大家有时间的话可不可以帮忙看下这段程序啊



附件是方程.

程序如下:
#include <math.h>
main() ;估计是在主程序的循环中出问题,但我总找不到
{double s0=0.5,s,a=0.001;
s=jf(s0);
while(fabs(s0-s)>0.01)
{printf("s=%f",s);
s0=s0+a;
}
printf("the final s si %f",s);
}


jf(double s0) ;程分子程序,是用求梯形面积和的办法积分的
{double sum_1=0,sum_2=0,x=0,a=0.001,i,j,f1,f2,f3,f4,s;

for(i=0;i<1000;i++)
{
f1=0.5*(3*x*x-1)*exp(s0*x*x);
x=x+a;
f2=0.5*(3*x*x-1)*exp(s0*x*x);
sum_1=sum_1+(f1+f2)*a*0.5;
}

x=0;
for(i=0;i<1000;i++)
{
f3=exp(s0*x*x);
x=x+a;
f4=exp(s0*x*x);
sum_2=sum_2+(f3+f4)*a*0.5;
}

s=sum_1/sum_2;

return(s);

}

[此贴子已经被作者于2006-3-31 17:31:39编辑过]

搜索更多相关主题的帖子: 迭代法 
2006-03-31 17:29
zcqycdl
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-3-31
得分:0 
我虽然数学学得不好,看不懂这个公式。但是您写的程序我看出了几点问题。
1:主函数中没有jf函数的声明(可能在不同的编译器中必要性不一样)。
2:jf函数的返回值默认是整型的,应为double jf(double s0)。
3:while(fabs(s0-s)>0.01)
{printf("s=%f",s);
s0=s0+a;
}
这个循环,一开始返回一个大于0。01的数,所以是一个死循环。
2006-03-31 21:57
Genial
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:175
专家分:0
注 册:2006-3-31
得分:0 

还有个地方,可能是主程序中漏了句:
s=jf(s0);

[此贴子已经被作者于2006-3-31 22:30:03编辑过]

2006-03-31 22:02
bluesky1
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-3-19
得分:0 
主函数中的也叫迭代吗?
好象没有根据哦

2006-03-31 22:10
guiban
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-3-31
得分:0 

回二楼的:我试过在jf前面加上个"double"但在编译时出现错误.说类型不匹配.while循环语句我是想实现的功能是先给一个初值S0,然后将求得的S与S0比较,当两者之差小于0.01时,就认为这个S是方程的解,跳出循环打印S到屏幕上,不然就S0加a再循环。直到求出为止。这个算法不知是不是迭代法。请问主函数能不能实现这个功能?谢谢各位抽时间来看我的程序了!!!!

2006-04-01 13:17
zcqycdl
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-3-31
得分:0 

回楼主:
定义函数时如果不指定返回值的类型那默认返回整型的。之所以说类型不匹配,我觉得是因为在主函数中
没有声明jf这个函数,可以考虑在main函数开头加上double jf();应该就不会出现你说的编译时出现错误.说类型不匹配.
另外jf函数的返回值是s=0.069598,而s0的值是0.5,本身s0-s就大于0.01,那么每次给s0加0.001后(s0-s)都是会衡大于
0.01的,是一个死循环。while循环中的最后一句改成(s=s+a;)可以解决这个问题,只是我不知道这个数学题意,楼主自
己考虑一下吧。
#include "stdio.h"
#include <math.h>
main()
{double s0=0.5,s,a=0.001;double jf();
s=jf(s0);

while(fabs(s0-s)>0.01)
{ printf("s=%f\n",s);

s=s+a;
}
printf("the final s si %f",s);
getch();
}


double jf(double s0)
{double sum_1=0,sum_2=0,x=0,a=0.001,i,j,f1,f2,f3,f4,s;

for(i=0;i<1000;i++)
{
f1=0.5*(3*x*x-1)*exp(s0*x*x);
x=x+a;
f2=0.5*(3*x*x-1)*exp(s0*x*x);
sum_1=sum_1+(f1+f2)*a*0.5;
}

x=0;
for(i=0;i<1000;i++)
{
f3=exp(s0*x*x);
x=x+a;
f4=exp(s0*x*x);
sum_2=sum_2+(f3+f4)*a*0.5;
}

s=sum_1/sum_2;

return(s);


}

2006-04-01 18:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-54175-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.827565 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved