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.
-
Siteye girdikten sonra Download kısmından kütüphaneyi indiriyoruz.
-
İndirdiğimiz zip dosyasının için “src.zip” diye başka bir dosya var. İçerisinde “net” adındaki dosyayı herhangi bir yere çıkartalım.
-
Eclipse veya Netbeans’te (ben Eclipse üzerinden anlatıyorum ama diğeri için de aynıdır) Workspace’mizdeki proje dosyamızı buluyoruz.
-
Proje dosyamızın içinde src adlı dosyaya olduğu gibi “net” adındaki çıkardığımız dosyayı kopyalıyoruz.
-
IDE’mizde Package Explorer kısmında projenin üzerine tıklayıp refresh yaptığımızda “net” adlı dosya package olarak görünecek ve kullanıma hazır olacaktır.
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 : )
}
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.