2015-07-10 40 views
6

Chciałbym obliczyć ograniczenia (rachunek różniczkowy) za pomocą Javy. Mam następujące klasy Limit że może obliczyć limity:Limit rachunku za pomocą Javy

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; 
    } 
} 

Jednak, zastanawiałem się: czy istnieje inny sposób obliczyć limity inne niż wyczerpanie i testowania rekurencyjnego? Czy istnieje bardziej wydajna metoda?

+0

Zajmę się zasadą L'Hummitala, by oszacować limity, gdybym był tobą. Może to być niezmiernie pomocne, chociaż może być konieczne dodanie kilku metod do klasy "Function". (jak widać tutaj: http://tutorial.math.lamar.edu/Classes/CalcI/LHospitalsRule.aspx) – StephenButtolph

Odpowiedz

4

Twoja technika nazywana jest aproksymacją numeryczną limitu. Jest szeroko stosowany, prosty w implementacji i na ogół wystarczająco dobry dla wielu aplikacji. Jest łatwy w użyciu, ponieważ wszystko, czego potrzebujesz, to funkcja, którą możesz ocenić, aby ją zastosować.

Jeśli chcesz w inny sposób, to nazywa symboliczny lub algebraiczne obliczenie limitów. W takim przypadku potrzebujesz więcej informacji, niż tylko możliwość oceny nieznanej funkcji. Aby funkcja zawierała wskazanie zmiennej niezależnej, musisz mieć całe wyrażenie drzewa parse. To więcej niż zdolność do oceny funkcji w danym punkcie. Jednym z przykładów tego w Pythonie jest pokazany tutaj:

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

Styl symboliczny używa reguł matematycznych rzeczywistym podobne do tego, jak można wypracować limit ręcznie przy użyciu zasad algebry lub rachunku.

+0

Dziękuję za ten dodatek. –

1

Obliczanie wielu problemów z limitem nie może być wykonane numerycznie, ofter dotyczy reguł symbolicznych, takich jak reguła L'Hopital, a zatem potrzebny jest symboliczny zestaw narzędzi algebry, które nie są tak dobre w Javie, ponieważ nie ma operacji przeciążania, wszystkie faceci matematyki idą do Pythona, lub klon, jeśli robisz coś poważnego. Samo implementacja numeryczna nie będzie zbyt dobra, nie można po prostu zastosować przybliżenia liczbowego dla limmitów, po wprowadzeniu symbolicznych obliczeń matematycznych przybliżenia są bardzo ograniczone do tego, co można z nimi osiągnąć, i trzeba sprawdzić zbieżność i wszelkiego rodzaju rzeczy, ale w każdym razie myślę, że możesz spróbować tego, co jest warte, ale nie używaj tego w poważnych aplikacjach.

+0

Widzę, że zasady symboliczne są ważne w rachunku różniczkowym. – HyperNeutrino

+0

Kto spadł i dlaczego proszę. – Snickers3192