12

有没有这样做的方法?我有一个需要曲线下面积的应用程序,并且我得到了公式,所以如果我可以手头进行集成,我应该能够以编程方式进行吗?我找不到我所指的方法的名称,但这张图片展示了它: http: //www.mathwords.com/a/a_assets/area%20under%20curve%20ex1work.gif

编辑:回复大家,我已经实现了矩形、梯形和辛普森规则。但是,它们需要 10k+ 条才能准确,我是否应该无法以编程方式找到功能的集成版本?如果没有,那肯定有一个该死的充分理由。

4

7 回答 7

4

数值积分
有多种方法,可以使用。有关描述,请查看数值食谱:科学计算的艺术
对于 Java,有 Apace Commons 库,可以使用。积分例程在数值分析部分。

符号集成
查看jScience函数模块“为相当简单的符号数学分析提供支持(求解代数方程、积分、微分、计算表达式等)”。
如果给定函数类型,则在特定情况下集成速度可能比使用某些标准库时更快。

于 2012-11-12T08:09:18.737 回答
1

要准确计算它,您需要某种计算机代数系统库来执行符号操作。这样的系统实现起来相当复杂,而且我不熟悉任何高质量的 Java 开源库。但是,假设它满足您的要求,另一种方法是使用梯形规则估计曲线下的面积。根据您要求结果的准确程度,您可以相应地改变细分的大小。

于 2012-11-12T08:10:38.803 回答
0

您可以使用数值积分,使用一些规则,例如已经提到的辛普森、梯形或蒙特卡罗模拟。它使用伪随机生成器。

您可以尝试一些用于符号积分的库,但我不确定您是否可以获得每个积分的符号表示。

于 2012-11-12T09:06:18.583 回答
0

我建议使用辛普森规则或梯形规则,因为集成每种类型的图可能过于复杂。

于 2012-11-12T08:06:23.513 回答
0

请参阅数值分析,特别是数值积分。使用黎曼和法怎么样?

于 2012-11-12T08:08:13.527 回答
0

这是一个简单但有效的方法:

public static double area(DoubleFunction<Double> f, double start, double end, int intervals) {
  double deltaX = (end - start)/intervals;
  double area = 0.0;
  double effectiveStart = start + (deltaX / 2);
  for (int i=0; i<intervals; ++i) {
    area += f.apply(effectiveStart + (i * deltaX));
  }
  return deltaX * area;
}

这是使用中点规则的黎曼和,它是梯形规则的变体,除了计算梯形的面积之外,我在区间中间使用 f(x) 的矩形。这更快并给出更好的结果。这就是为什么我的 x 的有效起始值位于第一个间隔的中间。通过循环一个整数,我避免了任何舍入问题。

我还通过等到循环结束再乘以来提高性能deltaX。我可以这样写循环:

for (int i=0; i<intervals; ++i) {
  area += deltaX * f.apply(effectiveStart + (i * deltaX)); // this is x * y for each rectangle
}

但是deltaX是恒定的,因此等待循环完成会更快。

于 2020-04-30T03:49:37.567 回答
-1

最流行的数值积分形式之一是 Runge-Kutta order 4 (RK4) 技术。它的实现如下:

double dx,  //step size 
       y ;  //initial value
for(i=0;i<number_of_iterations;i++){
    double k1=f(y);
    double k2=f(y+dx/2*k1);
    double k3=f(y+dx/2*k2);
    double k4=f(y+dx*k3);
    y+= dx/6*(k1+2*k2+2*k3+k4);
}

并且会比矩形、梯形和辛普森规则收敛得更快。它是物理模拟中最常用的集成技术之一。

于 2013-09-14T20:07:56.410 回答