Пределы исчисления с помощью Java

Я хочу вычислить пределы (исчисление) с помощью Java. У меня есть следующий класс Limit который может вычислять пределы:

package calculus;

public final class Limit {
    private Limit() {

    }

    public static final double limit(Function function, double approach) {
        double below = Limit.limitFromBelow(function, approach);
        double above = Limit.limitFromAbove(function, approach);
        return below == above ? below : Double.NaN;
    }

    public static final double limitFromBelow(Function function, double approach) {
        for (double d = approach - 10; d <= approach; d = approach
                - ((approach - d) / 10)) {
            if (function.apply(d) == Double.POSITIVE_INFINITY) {
                return Double.POSITIVE_INFINITY;
            } else if (function.apply(d) == Double.NEGATIVE_INFINITY) {
                return Double.NEGATIVE_INFINITY;
            } else if (Double.isNaN(function.apply(d))) {
                return function.apply(approach + ((approach - d) * 10));
            } else {
                if (d == approach) {
                    return function.apply(d);
                } else if (approach - d < 0.00000000001) {
                    d = approach;
                }

            }
        }
        return Double.NaN;
    }

    public static final double limitFromAbove(Function function, double approach) {
        for (double d = approach + 10; d >= approach; d = approach
                - ((approach - d) / 10)) {
            if (function.apply(d) == Double.POSITIVE_INFINITY) {
                return Double.POSITIVE_INFINITY;
            } else if (function.apply(d) == Double.NEGATIVE_INFINITY) {
                return Double.NEGATIVE_INFINITY;
            } else if (Double.isNaN(function.apply(d))) {
                return function.apply(approach + ((approach - d) * 10));
            } else {
                if (d == approach) {
                    return function.apply(d);
                } else if (d - approach < 0.00000000001) {
                    d = approach;
                }

            }
        }
        return Double.NaN;
    }
}

однако мне было интересно: есть ли другой способ вычислить пределы, отличные от исчерпания и рекурсивного тестирования? Есть ли более эффективный метод?

2 ответов


ваша техника называется численным приближением предела. Он широко используется, прост в реализации и, как правило, достаточно хорош для многих приложений. Он прост в использовании, потому что все, что вам нужно, это функция, которую вы можете оценить, чтобы применить ее.

Если вы хотите другой способ, он называется символическое или алгебраические расчет лимитов. В этом случае, вам нужно иметь больше информации, чем просто возможность оценить неизвестную функцию. Для функции необходимо иметь целое выражение дерева синтаксического анализа, включая указание независимой переменной. Это больше, чем просто возможность оценить функцию в данной точке. Один пример этого в Python показан здесь:

http://scipy-lectures.github.io/advanced/sympy.html#limits

символический стиль использует реальные математические правила, подобные тому, как вы могли бы разработать предел вручную, используя правила алгебры или исчисления.


вычисление многих предельных задач не может быть сделано численно, ofter включает символические правила, такие как правило L'Hopital, и поэтому вам нужен набор инструментов символической алгебры, которые не так велики в java, потому что нет перегрузки операции, все математические ребята идут на python или maple, если вы делаете какой-то серьезный бизнес. Численная реализация сама по себе не будет очень хорошей, вы не можете просто использовать численные аппроксимации для лимитов, как только вы введете символическую математику численную приближения очень ограничены тем, что вы можете достичь с ними, и вам нужно проверить сходимость и всевозможные вещи, но в любом случае я думаю, что вы можете пойти на то, что стоит, но не используйте это в любом серьезном приложении.