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

。
当我尝试用n < 8计算梯形规则时,它会产生一个比实际面积大得多的值,这是意想不到的,我已经绘制了f(x),并绘制了我认为前几个梯形的外观,它们都应该产生的面积小于目标面积。
然而,随着n的增加,误差变得越来越小,在n = 10000000时,误差在解决方案的0.001以内。
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;
}发布于 2021-10-16 22:11:17
如果在调试器中单步执行n=1的trapezoidRule,您将看到循环是针对i=1和i=2执行的,因为i=2被视为中点,所以它会被计算两次。
为什么对错误的i值执行循环?表达式i++使用后增量运算符,该运算符在返回变量的值后递增。您应该像任何正常人一样使用前增量运算符++i或for循环:
for (double i = 0; i <= n; i++) {发布于 2021-10-16 22:09:18
while( i++ <= n )导致了一个问题,因为它正在进行额外的迭代。
while( i++ < n )生成正确的值。
https://stackoverflow.com/questions/69599694
复制相似问题