Derivative Calculator
-
04-10-2019 - |
Domanda
Sono interessato a costruire una calcolatrice derivato. Ho tormentato il cervello sopra la soluzione del problema, ma non ho trovato una soluzione giusta a tutti. Che tu possa avere un suggerimento come iniziare? Grazie
Mi dispiace! Voglio chiaramente fare differenziazione simbolica.
Diciamo che avete la funzione f (x) = x ^ 3 + 2x ^ 2 + x
voglio visualizzare la derivata, in questo caso f '(x) = 3x ^ 2 + 4x + 1
mi piacerebbe per la sua attuazione in Objective-C per l'iPhone.
Soluzione
Presumo che si sta cercando di trovare l'esatto derivata di una funzione. (Differenziazione simbolica)
È necessario analizzare l'espressione matematica e memorizzare le singole operazioni nella funzione in una struttura ad albero.
Per esempio, x + sin²(x)
viene memorizzato come operazione +
, applicato al x
espressione e ^
(esponenziale) funzionamento sin(x)
e 2
.
Si può quindi ricorsivamente di differenziare l'albero applicando le regole di differenziazione per ogni nodo. Ad esempio, un nodo +
diventerebbe il u' + v'
, ed un nodo *
diventerebbe uv' + vu'
.
Altri suggerimenti
è necessario ricordare il vostro calcolo. fondamentalmente avete bisogno di due cose: tavolo di derivati ??di funzioni e regole di come derivati ??espressioni composte (come d(f + g)/dx = df/dx + dg/dx
) di base. Poi prendere espressioni parser e ricorsivamente andare altra l'albero. ( http://www.sosmath.com/tables/derivative/derivative.html)
let rec derive var = function
| Const(_) -> Const(0)
| Var(x) -> if x = var then Const(1) else Deriv(Var(x), Var(var))
| Add(x, y) -> Add(derive var x, derive var y)
| Mul(a, b) -> Add(Mul(a, derive var b), Mul(derive var a, b))
...
(Se non si conosce OCaml sintassi - derive
è a due parametri funzione ricorsiva, con primo parametro il nome della variabile, e il secondo essere mathched in linee successive, ad esempio, se questo parametro è una struttura di forma Add(x, y)
, restituire il Add
struttura costruita da due campi, con valori di x
derivati ??e y
derivati; e allo stesso modo per gli altri casi di ciò che derive
potrebbe ricevere come parametro, _
nei primi mezzi di pattern "match niente")
Dopo questo si potrebbe avere una qualche funzione di pulizia per riordinare l'espressione risultante (riducendo frazioni, ecc), ma questo si complica, e non è necessario per la derivazione stesso (cioè quello che si ottiene senza di essa è ancora una risposta corretta) .
Quando la trasformazione del s-exp è fatto, riconvertire la risultante s-exp in forma di stringa, di nuovo con una funzione ricorsiva
SLaks già descritta la procedura per la differenziazione simbolica. Vorrei solo aggiungere un paio di cose:
- matematica simbolica è in gran parte il parsing e trasformazioni degli alberi. ANTLR è un grande strumento per entrambi. Io suggerirei di iniziare con questo grande libro lingua modelli di implementazione
- Ci sono programmi open-source che fanno ciò che si vuole (ad esempio Maxima). Dissezione di un tale programma potrebbe essere interessante, anche (ma è probabilmente più facile da capire cosa sta succedendo, se si è tentato di scrivere da soli, prima)
- Probabilmente, si vuole anche una sorta di semplificazione per l'uscita. Ad esempio, solo applicando le regole di base derivati ??al
2 * x
espressione produrrebbe2 + 0*x
. Questo può anche essere fatto elaborazione albero (ad esempio trasformando0 * [...]
a0
e[...] + 0
a[...]
e così via)
Per quali tipi di operazioni Sei voler calcolare un derivato? Se si consente funzioni trigonometriche come seno, coseno e tangente, questi sono probabilmente meglio memorizzati in una tabella, mentre altri come polinomi possono essere molto più facile da fare. Stai permettendo per le funzioni di avere più ingressi, per es. f (x, y) piuttosto che semplicemente f (x)?
polinomi in una singola variabile sarebbe il mio suggerimento e poi considerare l'aggiunta in trigonometriche, logaritmiche, esponenziali e altre funzioni avanzate ai derivati ??di elaborazione che possono essere più difficile da fare.
differenziazione simbolica su funzioni comuni (+, -, *, /, ^, sin, cos, ecc) tralasciando regioni in cui è definita la funzione o il suo derivato è facile. Che cosa è difficile, forse counterintuitively, sta semplificando il risultato dopo.
Per fare la differenziazione, memorizzare le operazioni in un albero (o anche solo in notazione polacca) e fare un tavolo della derivata di ciascuna delle operazioni elementari. Poi ripetutamente applicare la regola della catena ei derivati ??elementari, insieme con l'impostazione della derivata di una costante a 0. Questo è veloce e facile da implementare.