曲线下面积 - 一维数组(Java)

时间:2016-07-21 10:53:15

标签: java math numerical-integration

我有一个简单的问题,在大多数语言(例如python)中都很简单。

我希望从1D阵列的固定点获得积分(曲线区域)。 Java显然有许多数值集成库,所有这些库似乎都需要一个函数(f {double(x)})作为输入。

但是我似乎无法找到任何容纳数组(double []),例如[1,4,10,11]。我将整合整个数组(x值1-n,其中n表示数组的大小)

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

嗯,他们期望功能,因为它的正常使用具有连续性。 由于每一步(1,2,3,4 ......?)只有不同的高度,因此在它们上面有三角形的矩形。三角形的高度是当前高度和前一个高度之间的差异。因此矩形的高度是当前品脱高度减去三角形高度。 编写一个计算和添加两个区域的函数。 对阵列中的每个点/项执行此操作,您将获得“函数”的积分。

编辑:我写了一些代码。不能保证,我只是编写了一些易于理解的这个积分概念的代码。必须进一步改进。

    public static double getIntegralFromArray(double[] ar, double xDist)
    {
        double base = 0;
        double prev = 0;
        double triHeight = 0;
        double rectHeight = 0;
        double tri = 0;
        double rect = 0;
        double integral = 0;
        for (int i = 0; i < ar.length; i++) {
            triHeight=Math.abs(ar[i]-prev); // get Height Triangle
            tri = xDist*triHeight/2;    // get Area Triangle
            if(ar[i]<=prev){
                rectHeight = Math.abs(base-ar[i]); // get Height Rectangle
            }else {
                rectHeight = Math.abs(base-(ar[i]-triHeight)); // get Height Rectangle
            }
            rect = xDist*rectHeight;    // get Area Rectangle
            integral += (rect + tri); // add Whole Area to Integral
            prev=ar[i];
        }
        return integral;
    }

    double[] ar = new double[]{1,2,3,2,2,3,1,3,0,3,3};
    System.out.println(MyMath.getIntegralFromArray(ar, 1));

    Area under 'curve': 21.5

答案 1 :(得分:1)

使用trapezoidal rule,您只需调用以下方法即可获得图表下的区域(约)

public static double trapz(double ar[],double xDist){
        if (ar.length==1 || ar.length==0)
            return 0;
        double integral=0;
        double prev=ar[0];
        for (int i=1;i<ar.length;i++)
        {
            integral+=xDist*(prev+ar[i])/2.0;
            prev=ar[i];
        }
        return integral;
    }