首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的梯形规则实现不能产生预期的结果?

为什么我的梯形规则实现不能产生预期的结果?
EN

Stack Overflow用户
提问于 2021-10-16 21:32:04
回答 2查看 47关注 0票数 0

我实现了一个函数来查找给定函数的trapezoid rule,该函数在以下方面产生了很差的结果

![](https://chart.googleapis.com/chart?cht=tx&chl=f(x%29=%5Clog%20_%7B2%7D(x%29)

当我尝试用n < 8计算梯形规则时,它会产生一个比实际面积大得多的值,这是意想不到的,我已经绘制了f(x),并绘制了我认为前几个梯形的外观,它们都应该产生的面积小于目标面积。

然而,随着n的增加,误差变得越来越小,在n = 10000000时,误差在解决方案的0.001以内。

代码语言:javascript
复制
  private interface MathFunc {
    double apply(double value);
  }
  private static final double A = 1;
  private static final double B = 9;
  public static void main(String args[]) {
    MathFunc func = (x) -> Math.log(x) / Math.log(2);
    double realValue = 16.98776493946568;
    for(int i = 1; i <= 8; i*=2) {
      double value = trapezoidRule(A, B, func, i);
      System.out.println(i + " Trapezoid Summation for f(x): " + value);
      double absError = Math.abs(value - realValue);
      System.out.println("Abs Error: " + absError);
      System.out.println("% Error: " + (absError/realValue)*100);
      System.out.println();
    }
  }
  static double trapezoidRule(double a, double b, MathFunc f, double n) {
    double deltaX = (b-a)/n;
    double i = 0;
    double sum = 0.0;
    while( i++ <= n ) {
      if(i == 0 || i == n) {
        sum += f.apply(a + (i*deltaX));
      } else {
        sum += 2 * f.apply(a + (i*deltaX));
      }
    }
    return (deltaX * sum) / 2.0;
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-16 22:11:17

如果在调试器中单步执行n=1的trapezoidRule,您将看到循环是针对i=1和i=2执行的,因为i=2被视为中点,所以它会被计算两次。

为什么对错误的i值执行循环?表达式i++使用后增量运算符,该运算符在返回变量的值后递增。您应该像任何正常人一样使用前增量运算符++i或for循环:

代码语言:javascript
复制
for (double i = 0; i <= n; i++) {
票数 1
EN

Stack Overflow用户

发布于 2021-10-16 22:09:18

代码语言:javascript
复制
while( i++ <= n )

导致了一个问题,因为它正在进行额外的迭代。

代码语言:javascript
复制
while( i++ < n )

生成正确的值。

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

https://stackoverflow.com/questions/69599694

复制
相关文章

相似问题

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