【问题标题】:Simpson's Rule error辛普森法则错误
【发布时间】:2016-01-12 18:44:31
【问题描述】:

此代码使用辛普森规则计算 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 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));
}

【问题讨论】:

  • 欢迎来到近似和浮点运算的世界。如果你使用一个近似公式,你会得到一个近似的结果。梯形规则最终得到“完全”正确的答案可能是侥幸。
  • 是的,这让我感到困惑的是,我认为辛普森的近似值比梯形的误差要小。但我想这可能只是我正在使用的功能的侥幸。谢谢
  • 经过 99999 次迭代,我得到了您所需的 1.440422 值。有些函数比其他函数收敛得更快,例如有几种方法可以计算pi,但并非所有方法都有用。

标签: c integral simpsons-rule


【解决方案1】:

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

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: %lf\n", n, y, z);

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

  1. 区间h不对。由于您使用的是n 点,因此存在n-1 间隔。因此,h 必须是:

    h = (z-y)/(n-1); 
    
  2. 由于您在最后一条语句中添加了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 的输出。

【讨论】:

  • scanf 中的逗号表示当您输入值时,您用逗号分隔它们。但无论如何我都试过了,它没有用。并用 printf 检查了它的值是正确的。
  • 谢谢,通过这些修复,它的近似值要好得多。
  • @user3908631,我很高兴能提供帮助。
猜你喜欢
  • 2018-08-18
  • 2014-01-06
  • 2021-04-19
  • 1970-01-01
  • 2018-11-01
  • 2018-05-20
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多