【问题标题】:Area Under Curve - 1D Array (Java)曲线下面积 - 一维数组 (Java)
【发布时间】:2016-11-24 22:22:48
【问题描述】:

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

我希望从一维固定点数组中获得积分(曲线面积)。 Java 显然有许多数值积分库,所有这些库似乎都需要一个函数 (f {double(x)}) 作为输入。

但是我似乎找不到任何可以容纳数组 (double []) 的东西,例如 [1,4,10,11]。我将对整个数组进行积分(x 值为 1-n,其中 n 表示数组的大小)

非常感谢任何帮助

【问题讨论】:

  • 自己实现Simpson's rule 并不难...
  • 同意,但是我更喜欢使用优化的库,这取决于将调用此函数的代码的性质

标签: java math numerical-integration


【解决方案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

【讨论】:

  • “你会得到你的函数的积分” - 嗯,积分的近似值......
  • 我很感激为解决方案付出的努力。虽然问题的目的是弄清楚没有 Java 库如何可能包含来自数组的有限积分,但我会接受这个答案,直到有人可以指出优化版本,类似于 (docs.scipy.org/doc/numpy/reference/generated/numpy.trapz.html)。谢谢
【解决方案2】:

通过使用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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 2011-06-24
    • 2020-03-30
    • 1970-01-01
    相关资源
    最近更新 更多