2012-10-16 9 views
7

È possibile trovare la derivata di una funzione utilizzando il programma c. Sto usando matlab in quanto ha una funzione incorporata diff() che può essere usata per trovare la derivata di una funzione.Come trovare una derivata di una funzione utilizzando c

f(x)=x^2 

È possibile trovare la derivata della funzione precedente utilizzando c. Qual è l'algoritmo per questo?

+0

se si desidera una derivata locale è possibile utilizzare il limite e ottenere una buona approssimazione. – elyashiv

+0

Il riferimento standard di fatto: http://www.nr.com/ – alk

+0

Vuoi una soluzione simbolica o analitica? La soluzione di @ H2CO3 fornirebbe una soluzione analitica (es .: differenziazione discreta). Se vuoi una risposta simbolica (es .: f '(x) = 2x) allora dovresti scrivere un parser, che è più complicato. – DevNull

risposta

13

Sì, è abbastanza possibile. Tuttavia, la soluzione dipende dalle tue esigenze. Se avete bisogno di una semplice soluzione numerica, quanto segue farà (in una certa misura, con alcuni vincoli - implementazione ingenuo):

double derive(double (*f)(double), double x0) 
{ 
    const double delta = 1.0e-6; // or similar 
    double x1 = x0 - delta; 
    double x2 = x0 + delta; 
    double y1 = f(x1); 
    double y2 = f(x2); 
    return (y2 - y1)/(x2 - x1); 
} 

// call it as follows: 
#include <math.h> 

double der = derive(sin, 0.0); 
printf("%lf\n", der); // should be around 1.0 

Per più avanzate numerici calcoli, è possibile utilizzare il GNU Scientific Library.

Tuttavia, se hai bisogno di trovare analiticamente il formula della derivata di una data funzione, allora dovete:

  1. analizzare la formula di ingresso alcuni tipi di dati astratti, ad esempio un AST;
  2. Derivale usando le identità e le regole di derivazione (ce ne sono solo alcune, questa parte dovrebbe essere la più semplice),
  3. Serializzare il tipo di dati astratto ottenuto come risultato del processo di derivazione in una stringa e in uscita come risultato.

Tuttavia, non è necessario eseguire tutto ciò; ci sono grandi librerie matematiche C che forniscono tale funzionalità.

Modifica: dopo un po 'su Google, non sono riuscito a trovarne uno. La soluzione più vicina per iniziare è che posso dare un'occhiata a GeoGebra's source code - sebbene sia scritto in Java, è abbastanza facile da leggere per chiunque abbia una buona conoscenza di un linguaggio simile a C. In caso contrario, basta andare avanti e attuare tale algoritmo di te stesso :)

+0

"Non riuscivo a trovarne uno" - beh, c'è Matlab (http://stackoverflow.com/questions/1513583/how-to-call-matlab-code-from-c) ;-) –

+0

@SteveJessop è opensource per esaminare come compie la derivazione analitica? –

+0

(@SteveJessop Spero tu non abbia creduto seriamente che non sapessi dell'esistenza di MatLab.) –

2

Non c'è nulla di costruito nel linguaggio C per abilitare questo. Si potrebbe essere in grado di trovare una libreria numerica per farlo anche se si cerca online, anche se dubito che ci sia qualcosa di disponibile che fornisca derivati ​​simbolici. Puoi prendere in considerazione la possibilità di codificare derivati ​​numerici approssimativi usando le differenze in avanti, indietro e/o centrale.

0

In C, si può fare la differenziazione numerica di massima relativamente facile, ma qualsiasi tipo di differenziazione simbolica richiede un quadro di terze parti o posizionare il proprio.

C è un linguaggio di programmazione generale e di basso livello, a differenza di Matlab, che è specializzato per i calcoli matematici e dispone di strumenti avanzati per i calcoli simbolici.

2

Per semplici le seguenti funzioni di differenziazione numerica funziona abbastanza bene:

typedef double (*TFunc)(double); 

// general approximation of derivative using central difference 
double diff(TFunc f, double x, double dx=1e-10) 
{ 
    double dy = f(x+dx)-f(x-dx); 
    return dy/(2.*dx); 
} 

// more or less arbitrary function from double to double: 
double f(double x) 
{ 
    return x*x; 
} 

// and here is how you get the derivative of f at specified location 
double fp = diff(f, 5.); 
1

So di essere in ritardo, ma ho scritto una libreria che fa esattamente questo.

Permette di analizzare la funzione, generando un albero di funzioni. Quindi puoi persino risolverlo o derivarlo.

Puoi trovarlo a. https://github.com/B3rn475/MathParseKit