这个代码是使用辛普森规则计算x*sin(x)的积分与(1,2)的界限。我遇到的问题是,虽然它非常接近实际值。即使经过了999次迭代,它仍然没有达到目标。虽然我有一个单独的程序,使用梯形规则对同样的事情,它确实击中点经过1000次迭代。它应该到达的点是"1.440422"
这是辛普森法则应该发生的吗?还是我的代码有问题?
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
double f(double x);
int main()
{
double x,result,y,z,h,s1,s2;
s1 = 0;
s2 = 0;
int i,n;
printf("nHow many points to you want it evaluated at (odd number)? And what are the bounds? lower bound,upper bound >n");
scanf("%d %lf,%lf",&n,&y,&z);
h = (z-y)/n;
result = 0;
if(n%2!=0)
{
for(i=0;i<n;i++)
{
if(i%2==0)
{
s1 = s1+f(y+i*h);
}
else
{
s2 = s2+f(y+i*h);
}
}
result = (h/3)*(f(y)+f(z)+4*s2+2*s1);
printf("nThe value is %lf with %d interationsn",result,i);
}
else
{
printf("n The number of points has to be odd, try againn");
}
}
double f(double x)
{
return(x*sin(x));
}
您看到的问题可能是由于用于读取数字的格式字符串。
scanf("%d %lf,%lf",&n,&y,&z);
// ^^^ Is the , there on purpose?
尝试从格式字符串中删除,
,看看问题是否消失。
始终检查scanf
的返回值
if ( scanf("%d %lf %lf", &n, &y, &z) != 3 )
{
// Deal with error.
}
为了确保读取的数字是准确的,添加一行将输入回显到stdout
。
printf("n: %d, y: %lf, z: %lfn", n, y, z);
我注意到你的代码中有几个错误:
h
时间间隔不正确。由于您使用的是n
点,因此存在n-1
区间。因此,h
必须是:h = (z-y)/(n-1);
由于您在最后一条语句中添加了
f(y)
和f(z)
,因此循环必须为:// Not good to use for(i=0;i<n;i++) for(i=1;i<n-1;i++) {
n = 1001
获得1.440422
的输出。