首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >辛普森规则误差

辛普森规则误差
EN

Stack Overflow用户
提问于 2015-10-14 15:23:26
回答 1查看 861关注 0票数 3

此代码使用Simpson规则计算x*sin(x)的积分,其边界为(1,2)。我遇到的问题是,当它非常接近实际价值的时候。即使有999次迭代,它仍然没有达到目的。虽然我有一个单独的程序,在相同的事情上使用梯形规则,但是在1000次迭代之后,它确实达到了这个点。它应该达到的目标是"1.440422“

辛普森的规则应该是这样吗?还是我的代码出了什么问题?

代码语言:javascript
复制
#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 interations\n",result,i);
    }
  else 
    {
      printf("\n The number of points has to be odd, try again\n");
    }
}


double f(double x)
{
  return(x*sin(x));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-14 15:47:50

您所看到的问题可能是因为用于读取数字的格式字符串。

代码语言:javascript
复制
scanf("%d %lf,%lf",&n,&y,&z);
         // ^^^ Is the , there on purpose?

尝试从格式字符串中删除该,,并查看问题是否消失。

这一点再强调也不为过-总是检查的返回值。

代码语言:javascript
复制
if ( scanf("%d %lf %lf", &n, &y, &z) != 3 )
{
   // Deal with error.
}

要确保读取的数字是准确的,请添加一行将输入回stdout

代码语言:javascript
复制
printf("n: %d, y: %lf, z: %lf\n", n, y, z);

我注意到您的代码中有几个错误:

  1. 间隔h不对。由于您使用的是n点,所以有n-1间隔。因此,h必须是: H= (z-y)/(n-1);
  2. 由于您要在最后一个语句中添加f(y)f(z),所以循环必须是: //用于(i=0;i

通过这些修复,我可以使用1.440422获得n = 1001的输出。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33129385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档