我已經實作了一個函式來找到給定函式的梯形規則,該函式產生的結果很差
.
當我嘗試用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;
}
uj5u.com熱心網友回復:
while( i <= n )
引起了問題,因為它正在進行額外的迭代。
while( i < n )
產生正確的值。
uj5u.com熱心網友回復:
如果您在除錯器中單步執行針對 n = 1 的 trapezoidRule,您將看到針對 i=1 和 i=2 執行回圈。由于 i=2 被視為中點,因此計算兩次。
為什么對錯誤的 i 值執行回圈?該運算式i 使用后增量運算子,它在回傳其值后增加變數。您應該 i像任何理智的人一樣使用預增量運算子或 for 回圈:
for (double i = 0; i <= n; i ) {
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/323483.html
