Kullanıcıdan Matematiksel Fonksiyon Almak[Java]

Okulumuzda sayısal analiz dersinde her dönem verilen proje ile uğraşırken veya matematiksel fonksiyonları kullanıcıdan almayı gerektirecek her türlü uygulamada faydalı olabilecek, başkası tarafından yazılmış bir java kütüphanesinden bahsedeceğim. Kullanıcıdan fonksiyonları x^2+5*x+7 şeklinde nasıl alabilirim şeklinde dün araştırırken buldum ve kullanımıyla ilgili bir şeyler yazacağım.

Fonksiyonları kullanıcıdan alırken bir kaç yöntem var. Bunlardan ilk akla gelen fonksiyonun kaçıncı dereceden olduğunu sormak ve ona uygun bir döngüyle katsayıları kullanıcıdan alıp hesaplama yapmak. Ancak her programcı daha kolay bir yöntem, yani ilk paragrafta bahsettiğim şekilde almak isteyecektir. Aynı şekilde kullanıcı da tek seferde fonksiyonunu yazmak isteyecektir. Bunun için çeşitli kütüphaneler var. Bunlardan biri Javaluator. Kullanımı ve çeşitli örnekler sitede var. Ancak Türkçe bir anlatımın gerekli olacağı düşüncesiyle başlıyorum.

Yazdığımız programlara dahil etmek için:

// Fonksiyon için değer hesaplıyor.
import net.astesana.javaluator.DoubleEvaluator;

// Fonksiyomuzdaki değişkenin yerine hangi
// değer yazılacağını belirteceğimiz metot.
import net.astesana.javaluator.StaticVariableSet;

Siteden alınmış örnek:

import net.astesana.javaluator.DoubleEvaluator;

public class Simplest {
  public static void main(String[] args) {

    // Nesnemizi oluşturuyoruz
    DoubleEvaluator evaluator = new DoubleEvaluator();

    // fonksiyomuz string türünde
    String expression = "(2^3-1)*sin(pi/4)/ln(pi^2)";
    // fonksiyonun değerini hesaplıyoruz.
    // değişken kullanmadik. Normal bir işlemi hesaplıyor
    Double result = evaluator.evaluate(expression);

    System.out.println(expression + " = " + result);
  }
}

Değişkenli bir örnek (Bisection yöntemi):

public static double BS(String fonk, double a, double b, double tol) {
    double sona,sonb,sonc;
    double c = 0;
    String expression = fonk;
    double N = 1;
    double NMAX = 100;

    // Kütüphane içerisinen kullanacağımız şeyleri tanımlıyoruz.
    DoubleEvaluator evaluator = new DoubleEvaluator();
    final StaticVariableSet<Double> variables = new StaticVariableSet<Double>();

    // matematiksel fonksiyomuzda x yerine a değişkenin değeri koy diyoruz.
    variables.set("x", a);
    sona = evaluator.evaluate(expression, variables);

    variables.set("x", b);
    sonb = evaluator.evaluate(expression, variables);

    variables.set("x", c);
    sonc = evaluator.evaluate(expression, variables);

    if( sona * sonb < 0) {

        while (N < NMAX) {
            c = (a + b) / 2;
            variables.set("x", c);
            sonc = evaluator.evaluate(expression, variables);
            System.out.println(sonc);

        if( sonc * sona < 0) {
            b = c;
            variables.set("x", b);
            sonb = evaluator.evaluate(expression, variables);
        }else if ( sonc * sonb < 0) {
            a = c;
            variables.set("x", a);
            sona = evaluator.evaluate(expression, variables);

        } else {
            System.out.println("error");
        }
        N++;
        }
    }
    return c;

    // Bisection yöntemi olarak fazla eksik kodlar mevcut : )
 }

Bisection yöntemi

Fonksiyonları arayüzden girdiğiniz zaman operatörlerin önceliğine dikkat etmek saç baş yolmaları engelleyecektir. Mesela 1/(x^2+1) yerine 1/x^2+1 girmek canınızı sıkacaktır. Öbür bir hata ise x^2+5*x+5 girilmesi gerekirken x^2+5x+5 yazmak yine sonuç vermeyecektir. 5x yerine 5*x girmelisiniz.

Bu kütüphane işimi çok kolaylaştırdı. Kullanımı da çok basit. Kullanırken yeni güzellikler keşfederseniz haber verin. Sizin kullandığınız, bulduğunuz kullanıcıdan fonksiyon alma yöntemi nedir?

İyi çalışmalar.