View Full Version : [Java]Calcolare la funzione derivata di una funzione data.
:.Blizzard.:
11-12-2009, 17:38
Supponiamo che venga immessa dall'utente una funzione di questo tipo:
http://img683.imageshack.us/img683/7624/immaginewo.png
Che viene appunto visualizzata sia con una visuale più "intuitiva" e una più "testuale".
Il mio obiettivo è quello di calcolarne la funzione derivata usando le regole di derivazione (http://it.wikipedia.org/wiki/Regole_di_derivazione). L'unica cosa che ho già implementato è quella di trasformare la stringa in notazione polacca inversa (http://it.wikipedia.org/wiki/Notazione_polacca_inversa) in modo da poter lavorare senza preoccuparmi delle parentesi. Secondo voi è una cosa fattibile oppure è meglio che ricorro a classi già implementate? Se sì, a quali?
Grazie a chiunque voglia darmi un suggerimento, una dritta o un aiuto.
A questo indirizzo potete notare una cosa identica già realizzata, in grado di ottenere il risultato che stò cercando:
http://www.geogebra.org/webstart/geogebra.html
gangiaemi
11-12-2009, 18:16
Ciao, anche io ho un problema del genere.
Purtroppo in java , di classi gia implementate , ho trovato solo questa :
https://eval.dev.java.net/
Non so se conosci javascript. questo linguaggio ha una funzione che si chiama appunto eval, che farebbe proprio al caso tuo ;) ma che non è implementata in java.
Quello che hai fatto tu, ossia creare un algoritmo per la creazione di formule in forma postfissa, non è male.
Tuttavia, dovresti crearti un parser che ti possa gestire la maggiorparte delle funzioni matematiche.
PS : puoi inviarmi o mettere nel post, il codice per la postfissa per favore ?
:.Blizzard.:
11-12-2009, 19:09
Premetto che tutto questo lo stò facendo per la mia tesi. Stò infatti sviluppando -ormai sono alla fine - un software che dovrà essere utilizzato da dei matematici per lo studio di particolare figure geometriche costruite a partire da funzioni convesse continue e quindi derivabili.
Avevo quindi necessità di disegnare funzioni e ho pensato quindi di utilizzare la polacca inversa che è l'unica che mi permette, utilizzando un opportuno parser, di sfruttare la notazione per risolvere quindi una funzione e poterla disegnare per passi discreti (poichè ovviamente discreti sono i pixel :D ).
Per trasformare una notazione infissa in postfissa ho sviluppato il codice Java dell'algoritmo Shunting Yard (Dijkstra) (http://en.wikipedia.org/wiki/Shunting-yard_algorithm).
*la classe Parser implementa al suo interno il metodo Shunting Yard*
public class TestParser {
public static void main(String[] v){
String s = "(x^2)*sin((log(tan(x^2)))/(acs(x^e)-x))";
Parser myParser = new Parser();
myParser.initParser(s, 1);
System.out.println(myParser.resolvePostfix());
}
}
Output calcolato sul vaore x = 1 :
[1.0, 2, ^, 1.0, 2, ^, tan, log, 1.0, 2.718281828459045, ^, 1.0, -, acs, /, sin, *]
Risultato : 0.27831277
Spero i conti siano fatti bene ... spero :asd:
Uhm ... aspetta che mi sono appena accorto che c'è qualcosa che non và nei conti.
Ok, corretto .. mi sono accorto di un errore con le parentesi.
gangiaemi
13-12-2009, 12:22
Supponiamo che venga immessa dall'utente una funzione di questo tipo:
http://img683.imageshack.us/img683/7624/immaginewo.png
Che viene appunto visualizzata sia con una visuale più "intuitiva" e una più "testuale".
Il mio obiettivo è quello di calcolarne la funzione derivata usando le regole di derivazione (http://it.wikipedia.org/wiki/Regole_di_derivazione). L'unica cosa che ho già implementato è quella di trasformare la stringa in notazione polacca inversa (http://it.wikipedia.org/wiki/Notazione_polacca_inversa) in modo da poter lavorare senza preoccuparmi delle parentesi. Secondo voi è una cosa fattibile oppure è meglio che ricorro a classi già implementate? Se sì, a quali?
Grazie a chiunque voglia darmi un suggerimento, una dritta o un aiuto.
A questo indirizzo potete notare una cosa identica già realizzata, in grado di ottenere il risultato che stò cercando:
http://www.geogebra.org/webstart/geogebra.html
Ciao, come hai fatto a parsare la stringa che gli passi ?
:.Blizzard.:
13-12-2009, 12:26
Tramite la classe StringTokenizer del Java. Solo che mi hanno detto che è obsoleta, ma ormai è troppo tardi per rivedere l'intero codice.
gangiaemi
15-12-2009, 16:16
Ciao, non so se ti possa ritornare utile, ma ho trovato un bel parserino di espressioni matematiche :
http://sourceforge.net/projects/jep/
Vi è il link al sito, sul suo funzionamento.
Tuttavia ho trovato anche questo link, con altra documentazione :
http://www.singsurf.org/djep/html/index.html
Io sto facendo qualche test del tipo : (e^x + cos(x))^2 e funziona.
Ti faccio una domanda : per il calcolo della derivata , non ti converrebbe utilizzare il rapporto incrementale?
Ciao ciao
E.
banryu79
16-12-2009, 00:11
Tramite la classe StringTokenizer del Java. Solo che mi hanno detto che è obsoleta, ma ormai è troppo tardi per rivedere l'intero codice.
E' "obsoleta" a leggere i relativi javadoc.
Ma obsoleta non vuol dire deprecata o che funziona male, e, visto che l'alternativa è l'utilizzo di classi e/o metodi basati sulle regular expression, tu usala lo stesso invece di rischiare di spararti sulle palle con le regex :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.