java - 我的辛普森法则计算器正确吗(java)?

标签 java algorithm math calculator precision

我应该计算

enter image description here

使用辛普森规则,有 4 个子区间。

我当然不想手工完成,所以我尝试用 Java 编写该算法。

辛普森法则的公式为

enter image description here

这是我的代码:

import java.util.Scanner;
import java.util.Locale;
public class Simpson {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in).useLocale(Locale.US);
        //e= 2.718281828459045 to copy paste
        System.out.println("Interval a: ");
        double aInt = input.nextDouble();
        System.out.println("Interval b: ");
        double bInt = input.nextDouble();
        System.out.println("How many sub intervals: ");
        double teilInt = input.nextDouble();
        double intervaldistance = (bInt-aInt)/teilInt;
        System.out.println("h = "+"("+bInt+"-"+aInt+") / "+teilInt+ " = "+intervaldistance);
        double total = 0;
        System.out.println("");
        double totalSum=0;

        for(double i=0; i<teilInt; i++) {
            bInt = aInt+intervaldistance;
            printInterval(aInt, bInt);
            total = prod1(aInt, bInt);
            total = total*prod2(aInt, bInt);
            aInt = bInt;
            System.out.println(total);
            totalSum=totalSum+total;
            total=0;
        }
        System.out.println("");
        System.out.println("Result: "+totalSum);
    }
    static double prod1(double a, double b) { // first product of simpson rule; (b-a) / 6
        double res1 = (b-a)/6;
        return res1;
    }
    static double prod2(double a, double b) { // second pproduct of simpson rule
        double res2 = Math.log(a)+4*Math.log((a+b)/2)+Math.log(b);
        return res2;
    }
    static void printInterval(double a, double b) {
        System.out.println("");
        System.out.println("["+a+"; "+b+"]"); 
    }
}

Output for 4 sub intervals:

[1.0; 1.4295704571147612]
0.08130646125926948

[1.4295704571147612; 1.8591409142295223]
0.21241421690076787

[1.8591409142295223; 2.2887113713442835]
0.31257532785558795

[2.2887113713442835; 2.7182818284590446]
0.39368288949073565

Result: 0.9999788955063609

现在,如果我将我的解决方案与其他在线计算器( http://www.emathhelp.net/calculators/calculus-2/simpsons-rule-calculator/?f=ln+%28x%29&a=1&b=e&n=4&steps=on )进行比较,它会有所不同..但我不明白为什么我的解决方案应该是错误的。

我的解决方案是0.9999788955063609,在线解决方案是0.999707944567103

也许我犯了一个错误?但我仔细检查了所有内容,但找不到。

最佳答案

多次执行 b_n = a_{n} + Interval 可能会累积舍入误差。 相反,您可以使用归纳方法,即 a_n = a_0 + n*interval,因为这只涉及引入一次舍入误差。

我将用实际数字进行测试,以确认并充实答案,但与此同时,您可以观看 handmade hero 中关于错误累积的解释。


<子>PS。作为奖励,您可以观看手工英雄的摘录!

更新:我查看了您的链接。虽然我上面描述的问题确实适用,但精度差异很小(您将得到答案 0.9999788955063612)。您的情况出现差异的原因是您的在线计算器中使用的公式在表示法方面略有不同,它将间隔 [a,b] 视为 2h。换句话说,您的 4 个间隔在他们的计算中相当于 8 个间隔。

如果您在该网页中放置 8 个矩形,您将得到与此处(更准确)数字相同的结果:

Answer: 0.999978895506362.

查看该网页上使用的符号的更好解释 here

关于java - 我的辛普森法则计算器正确吗(java)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44855622/

相关文章:

java - 慢速 Java Swing 菜单的解决方法

java - 如何从java中的YAML文件中读取?

java - MapReduce 中的函数组合

math - 离散结构与离散数学的区别

java - 框架添加不适用于另一个 java 文件

java - 如何在java中创建和填充数组列表?

algorithm - 方程求解算法

algorithm - 两个文本的相似性(关键字的自适应局部对齐?)

algorithm - 平方 n 位整数与乘以两个 n 位整数

math - LISP 中的计数器变量