记录一次定积分实现方法(java)

3,386 阅读2分钟

1、积分计算原理

    众所周知,定积分在集合图形中的意义就是函数f(x)在某区间内的面积,由推导原理可得公式

Δx越小越精确,无限趋于0但不可能等于0,也就是说要把函数f(x)下的面积垂直做以Δx宽的细小矩形然后累加求极限。

2、通过原理用代码实现积分过程

此方法的作用是函数f(x)以a,b为区间的封闭图形中等分的量级大小

// 微分间隔
public static double sub(double a, double b, double n) {
    return (b - a) / n;
}

此方法的作用就是在函数f(x)以a,b为区间的封闭图形中做n次等分累加运算这部分a、b分别代表积分区间上下限,n代表函数f(x)以a,b为区间的封闭图形中等分数量,也就是说等分数量越大,算出的值就越精确,i代表第几次等分累加运算。

// 微分求积
public static double differential(double a, double b, double n, int i) {
    return a + i * (b - a) / n;
}

此方法为定义被积分的函数,也就是在几何意义中曲边梯形的那条曲边函数f(x),示例函数为一条开口向上顶点为(0,0)的抛物线

// 被积函数
public static double f(double x) {
    return x * x;
}

以上三个方法都是计算积分的重要元素,现在我们把他们连起来操作一波,首先定义被积函数的上下限,这里示例对函数f(x)下的曲边梯形垂直做100000等分,通过循环累加每个小的梯形面积最终得出函数f(x)在top botm区间的近似面积和(这里只能取近似,不能像数学概念中取极限。目前不知道无穷大该怎么定义[逃])

//计算积分
private static double integral(int top, int botm) {
    double sub = sub(top, botm, 100000);
    double sum = 0;
    for (int j = 1; j <= 100000; j++) {
        double x = differential(sub, botm, 100000, j);
        sum = sum + f(x);

    }
    return sum * sub;
}

public static void main(String[] args) {
    System.out.println("x 0-5 的定积分为:" + integral(0, 5));
}

最后通过牛莱公式手动验证,结果和通过我们的方法运行得出的近似值基本保持一致。

TODO

如何实现通过提供的函数进行积分运算

以直线方程y=kx+b为例

public static void lineEquation(int x1, int y1, int x2, int y2) {
    int k, b;
    k = k(x1, y1, x2, y2);
    b = b(x1, y1, k);
    System.out.println("y=" + k + "x+" + b);
}

//直线斜率公式
private static int k(int x1, int y1, int x2, int y2) {
    return (y2 - y1) / (x2 - x1);
}


//直线截距公式
private static int b(int x, int y, int k) {
    return y - k * x;
}