PDA

View Full Version : [C++] Funzioni Matematiche


El_SiF
17-04-2010, 15:16
Salve Ragazzi,
avrei l'esigenza di predisporre una box dove l'utente possa inserire una sua equazione del tipo:
e^x + (4/25)*sqrt(5*x)
Dovrei dunque predisporre del codice che mi calcoli i valori di y (la funzione immessa) al variare di x (il passo lo posso scegliere io e non costituisce un problema).

Avete idee di come implementare un semplice parser che riconosca le funzioni immesse dall'utente (notasi che non posso conoscere a priori l'ordine degli operatori)? Non ho esigenza di "parsare" integrali, derivate o roba del genere.. al più esponenziali, radici (meglio se si potesse specificare anche l'indice della radice), pi-greco (o costanti di vario genere) ecc...

Non ho problemi ad utilizzare librerie esterne, non devo necessariamente scrivere io il codice, avevo dunque pensato a QtScript (magari creando un engine) o le RegExp (magari anche QRegExp).

Avete suggerimenti?


Aggiornamento: forse potrebbe anche andare questo: http://muparser.sourceforge.net

:.Blizzard.:
17-04-2010, 19:44
Potresti trasformare la funzione immessa dall'utente dalla notazione infissa alla notazione postfissa (conosciuta come RPN). Così facendo risolvi il problema di non dover tener conto dell'ordine degli operandi. Dopodiché basta iterare il valore di x e sostituirlo all'interno dello Stack risultante contenente la notazione polacca inversa e risolvi tranquillamente l'espressione.

Link:
http://en.wikipedia.org/wiki/Reverse_Polish_Notation
http://en.wikipedia.org/wiki/Shunting-yard_algorithm


Questa è la soluzione che ho utilizzato io in un programma che ho scritto in Java che doveva lavorare con delle funzioni immesse dall'utente (e anche disegnarle ... ma questa è un'altra storia :D ).

Per il discorso Parser cerca di controllare, sicuramente in C++ esisterà qualche libreria a riguardo. La parte più complessa però è quella di gestire la funzione data in input.

Se non ti è chiaro qualcosa chiedi pure :)


ps vedo che è comunque un problema che capita di affrontare a molte persone ... magari prima o poi proverò a scrivere una piccola guida a riguardo.