wie man die Ableitung der Funktion in Matlab auswertet?

8

Das sollte sehr einfach sein. Ich habe eine Funktion f(x) , und ich möchte f'(x) für eine gegebene x in MATLAB auswerten.

Alle meine Suchen sind mit symbolischer Mathematik entstanden, was ich nicht brauche, ich brauche numerische Differenzierung.

z. wenn ich definiere: fx = inline('x.^2')

Ich möchte sagen f'(3) , das wäre 6 , ich möchte nicht 2x

finden     
lms 11.01.2011, 14:30
quelle

5 Antworten

7

Um eine numerische Differenz (symmetrische Differenz) zu erhalten, berechnen Sie (f(x+dx)-f(x-dx))/(2*dx)

%Vor%

Alternativ können Sie einen Vektor mit Funktionswerten erstellen und DIFF anwenden, dh

%Vor%

Beachten Sie, dass diff die Vorwärtsdifferenz annimmt und dass dx gleich 1 ist.

In Ihrem Fall ist es jedoch besser, fx als Polynom zu definieren , und evaluieren die Ableitung der Funktion, anstatt die Funktionswerte.

    
Jonas 11.01.2011, 14:40
quelle
9

Wenn Ihre Funktion bekanntermaßen zweimal differenzierbar ist, verwenden Sie

%Vor%

was in h eine Genauigkeit zweiter Ordnung ist. Wenn es nur einmal differenzierbar ist, verwenden Sie

%Vor%

was erste Ordnung in h ist.

Das ist Theorie. In der Praxis sind die Dinge ziemlich schwierig. Ich nehme die zweite Formel (erste Ordnung), da die Analyse einfacher ist. Tun Sie die zweite Ordnung als Übung.

Die erste Beobachtung ist, dass Sie müssen sicherstellen, dass (x + h) - x = h, sonst erhalten Sie große Fehler. In der Tat sind f (x + h) und f (x) nahe beieinander (sagen wir 2.0456 und 2.0467), und wenn man sie subtrahiert, verliert man viele signifikante Zahlen (hier ist es 0.0011, was 3 signifikante Zahlen weniger hat als x). Jeder Fehler bei h hat wahrscheinlich einen großen Einfluss auf das Ergebnis.

Also, ersten Schritt, fixiere einen Kandidaten h (ich zeige dir in einer Minute, wie ich ihn wählen soll), und nimm als h für deine Berechnung die Menge h '= (x + h) - x. Wenn Sie eine Sprache wie C verwenden, müssen Sie h oder x als flüchtig definieren, damit diese Berechnung nicht optimiert wird.

Als nächstes wird die Wahl von h. Der Fehler in (*) besteht aus zwei Teilen: dem Abbruchfehler und dem Abrundungsfehler. Der Abbruchfehler ist, weil die Formel nicht genau ist:

%Vor%

wo e1(h) = h / 2 * sup_{x in [0,h]} |f''(x)| .

Der Abrundungsfehler kommt von der Tatsache, dass f (x + h) und f (x) nahe beieinander liegen. Es kann grob geschätzt werden als

%Vor%

Dabei ist epsilon_f die relative Genauigkeit bei der Berechnung von f (x) (oder f (x + h), die eng ist). Dies muss anhand Ihres Problems beurteilt werden. Für einfache Funktionen kann epsilon_f als Maschinen-Epsilon verwendet werden. Für kompliziertere kann es um Größenordnungen schlimmer sein.

Sie wollen also h , was e1(h) + e2(h) minimiert. Alles zusammenstecken und optimieren in h ergibt

%Vor%

was anhand Ihrer Funktion geschätzt werden muss. Sie können grobe Schätzungen vornehmen. Wenn Sie Zweifel haben, nehmen Sie h ~ sqrt (epsilon), wobei epsilon = Maschinengenauigkeit ist. Für die optimale Wahl von h ist die relative Genauigkeit, zu der die Ableitung bekannt ist, sqrt (epsilon_f), dh. die Hälfte der signifikanten Zahlen sind korrekt.

Kurz gesagt: zu klein a h = & gt; Abrundungsfehler, zu groß a h = & gt; Kürzungsfehler.

Für die Formel zweiter Ordnung ergibt dieselbe Berechnung

%Vor%

und eine fraktionale Genauigkeit von (epsilon_f) ^ (2/3) für die Ableitung (die typischerweise um ein oder zwei signifikante Zahlen besser ist als die Formel erster Ordnung, unter der Annahme doppelter Genauigkeit).

Wenn dies zu ungenau ist, fragen Sie nach mehr Methoden, es gibt viele Tricks, um eine bessere Genauigkeit zu erreichen. Die Richardson-Extrapolation ist ein guter Anfang für reibungslose Funktionen. Aber diese Methoden berechnen in der Regel f einige Male, dies kann oder kann nicht sein, was Sie wollen, wenn Ihre Funktion komplex ist.

Wenn Sie numerische Ableitungen oft an verschiedenen Punkten verwenden, wird es interessant, eine Tschebyscheff-Näherung zu konstruieren.

    
Alexandre C. 14.01.2011 14:26
quelle
6

Ohne die symbolische Toolbox hält Sie nichts davon ab, Derivest zu verwenden, ein Werkzeug zur automatischen adaptiven numerischen Differenzierung.

%Vor%

Für Ihr Beispiel ist es sehr schön. Tatsächlich liefert es sogar eine Schätzung des Fehlers in der resultierenden Annäherung.

%Vor%     
user85109 12.01.2011 00:07
quelle
4

Haben Sie versucht diff (berechnet Differenzen und approximiert eine Ableitung), gradient oder polyder (berechnet die Ableitung eines Polynoms) Funktionen?

Sie können mehr über diese Funktionen lesen, indem Sie help <commandname> in der MATLAB-Konsole verwenden oder den Funktions-Browser im Hilfe-Menü verwenden.

    
posdef 11.01.2011 14:39
quelle
0

Für eine gegebene Funktion in analytischer Form können Sie die Ableitung an einem gewünschten Punkt mit dem folgenden Code auswerten:

%Vor%

Verwenden Sie für reine numerische Ableitungen die bereits gegebenen Lösungen von Jonas und posdef.

    
zellus 11.01.2011 15:14
quelle

Tags und Links