Warum Kann Man In Java Keine Funktionen Einlesen? ... oder geht es doch?
#1
geschrieben 21. Dezember 2005 - 18:03
mein Anliegen: Ich möchte in Java eine Funktion f(x) einlesen:
z.b. 3x²+2x+5, s. d. ich anschl. damit ein paar mathematische Spielereien machen kann, z.b. Differenziale/Integrale/Nullstellen etc. berechnen ... nur wie geht das? ich will natürlich nicht die funktion bereits im quelltext definieren, sondern es soll für jede funktion f(x), die der benutzer eingegeben hat, funktionieren:
ein paar leute, die ich schon fragte, sagten mir nur eins: verwende matlab/scilab ... aber ich möchte doch anwendungen für enduser programmieren und keinen algorithmus testen.
es gibt zwar die möglichkeit, die fkt. als zeichenkette einzulesen und danach auseinander zu friemeln, aber das ist nur eingeschränkt möglich ... z.b. wüsst ich nicht, wie es bei f(x)=cos²x funktionieren würde, abgesehen davon erkennt Java nur Potenzen bis zur Größenordnung 3, wenn man sie als String auseinander flicken möchte - ich suche also eine Klasse, mit der ich Funktionen einlesen und anschl. damit rechnen kann. Falls das nicht möglich ist, dann frage ich mich, wie die ganzen hobbyprogrammierer mit so etwas umgehen (z.b. appomatox, deadline, ...)
bin für jede Hilfe dankbar :-)
LG
Gunnar
Anzeige
#2
geschrieben 21. Dezember 2005 - 18:16
ergebnis = rechne(wert1,wert2);
Seit wann kann man denn einer funktion einen Wert als "rechne() = wert" übergeben?

#3
geschrieben 21. Dezember 2005 - 18:33
ich möchte, dass der benutzer eine mathematische funktion (wie in der schule, also 3x+x+1/x² ...) und z.b. eine stelle 'x' eingeben kann, und das programm dann mit dieser eingegebenen funktion an der stelle 'x' berechnungen durchführt ... das hat erstmal nichts mit dem funktionsaufruf in der informatik zu tun, mein problem ist, wie krieg ich diese funktion, also diese usereingabe, in einen kontext mit einem numerischen algorithmus, d.h. die variable 'x' muss das programm innerhalb des eingebenen userstrings erkennen und damit rechnen können ...
nur wie geht man hier vor?
btw: gruß nach niederwürschnitz, das ist ja fast nur nen katzensprung entfernt ;-)
Dieser Beitrag wurde von du ciel bearbeitet: 21. Dezember 2005 - 18:37
#4
geschrieben 21. Dezember 2005 - 19:37
Dank Interfaces und Generics lassen sich ja zumindest funktionale Ausdrücke relativ ordentlich als Aggregationen ausdrücken.
Die andere Möglichkeit wäre, es in eine geeignete Java-Expression in einer Klasse zu überführen, via JVM-Management den Compiler anzuwerfen und dann die kompilierte Klasse zu laden. Sowas geht dann aber nicht in Applets.
Dieser Beitrag wurde von Rika bearbeitet: 21. Dezember 2005 - 19:41

Ja, mata ne!
(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
#5
geschrieben 21. Dezember 2005 - 20:38

#6
geschrieben 21. Dezember 2005 - 21:02
Aber es gibt einige Java-Packete, die solch ähnliche Funktionen bereits implementieren. Google hilft.

Ja, mata ne!
(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
#7 _Newlukai_
geschrieben 22. Dezember 2005 - 08:27
Woher sollte die API den Unterschied zwischen 2^3, exp(2, 3) und pow(2, 3) kennen?
Im SKD wird man sowas nicht finden, der Anwendungsfall ist wohl zu spezifisch. Evtl. gibt es eine API, aber am wahrscheinlichsten ist es, das Du selbst implementieren mußt.
#8
geschrieben 23. Dezember 2005 - 15:50
x + x wird eingeben
dann kann man so vorgehen, du hast eine Klasse, die Addiert zahlen(pseudo code):
int add(a,b)
{
return (a+b);
}
Also kannst du das obige berechnen in dem du seine Eingabe einliest und prüfst :
irgendwas(x) gefolgt von + (okay hier muss ich ein add machen) gefolgt von x, passt ist ne korrekte Formel.
somit rufst du dein add(x,x) auf.
Stünde da nun:
x+x*2
dann musst du beim parsen natürlich das zerlegen, sprich nach Rangfolge, du parst und erkennst * kommt vor +, also wird deine Aufrufkette so aussehen:
result=multi(x,2)
add(x,result)
steht da ein x^3, dann erkennst du, dass du:
result=multi(x,x)
rsult=multi(result,x)
machen musst usw.
Also was du benötigst ist am besten als erstes ein scanner, der drüber läuft und guckt ist es erstmal ein gultiger Ausdruck, danach am besten in einem Bau die Struktur des Ausdrucks aufbauen Stichwort Syntaxbaum, so in etwa:
x*c+x*d
dann sieht dein Baum aus:
+
.. ..
* *
von unten her rufst du dann deine Funktionen mit den entsprechenden Werten auf.
Es reichen ja für die Grundoperationen einfach add,sub,multi... und komplizierte Ausdrücke kannst du ja darauf zurückführen also z.B. X^4
Am einfachsten geht sowas mit nem parser und scanner generator wie bison und flex, die werden beim compilerbau benutzt um selber programmiersprachen zu definieren und da ist die Vorgehensweise identisch.
#9
geschrieben 23. Dezember 2005 - 17:40
von den genannten scannern hab ich noch nichts gehört aber thx für die infos!
gunnar