Wie mit MatLab eine Funktion mit mehreren Parametern nach EINEM Parameter ableiten?

2 Antworten

Ich kenne Matlab nur vom Namen her, und habe Matlab selber nie ausprobiert.


Aber ich kenne eine andere App :

http://www.wolframalpha.com/widgets/view.jsp?id=164f98ba2892701d67ee2aa3ace7a1f6

Ins erste Feld gibt man die Funktion ein.

Ins zweite Feld gibt man die Variable bzw. den variablen Parameter ein, nach dem abgeleitet werden soll.

Danach "Submit" anklicken, und man bekommt die partielle Ableitung nach der gewünschten Variable angezeigt.

Ich weiß nicht ob dir das was nutzt oder nicht.

Alternativ kannst du auch das kostenlos downloadbare Programm wxMaxima verwenden, welches sowohl unter Windows als auch unter Linux zur Verfügung steht.

Der Befehl

diff(x ^ 3 * y + y ^ 3 * x ^ 2, x, 1);

leitet bei dem Programm Maxima beispielsweise die Funktion f(x, y) = x ^ 3 * y + y ^ 3 * x ^ 2 genau einmal partiell nach x ab.

diff(x ^ 3 * y + y ^ 3 * x ^ 2, x, 2);

leitet genau zweimal partiell nach x ab.

diff(x ^ 3 * y + y ^ 3 * x ^ 2, y, 3);

leitet genau drei mal partiell nach y ab.

Der Befehl

diff(x ^ 3 * y + y ^ 3 * x ^ 2, x, 1, y, 1, x, 1);

leitet einmal partiell nach x, danach einmal partiell nach y und danach wieder einmal partiell nach x ab, genau in der Reihenfolge.

Der Befehl

diff(x ^ 3 * y + y ^ 3 * x ^ 2, x, 2, y, 1);

leitet zwei mal hintereinander partiell nach x ab und danach einmal partiell nach y ab.

Der Befehl

diff(x ^ 3 * y + y ^ 3 * x ^ 2);

zeigt das sogenannte totale Differential der Funktion an.

https://goo.gl/WG9Ndp

wxMaxima ist auch recht gut im Internet dokumentiert und recherchierbar.

Wie schon gesagt weiß ich nicht, ob dir das was bringt.

meines wissens nach gibt es keine "schlaue" matlab funktion fürs ableiten. ich kann dir auch erklären warum ich das sinnvoll finde.

matlab kann NICHT integrieren oder ableiten, sondern beides nur numerisch approximieren. du kannstmit matlab ja auch nicht die stammfunktion bilden (ungefähr das umgekehrte zum ableiten). jedoch ist die "flächenbilanz" (so hieß das glaube ich in der schule) ja keine funktion, sondern nur eine approximation an die flächen, die der graph mit der x-achse einschließt. das ist also eher wenig information. die stammfunktion, mit der du selbstverständlich auch an den integral-wert kommst, ist sehr viel information. das wirst du numerisch nicht gut hinbekommen. das muss man annähern. ebenso muss man die ableitung annähern.

warum ist das annähern dieser speziellen funktionen (stammfunktion, ableitungsfunktion) so schwierig?

zur approximation müssen meist mehrere informationen der eigentlichen funktion benutzt werden, z.B. 2 stützstellen der funktion um die sekantensteigung zu berechnen, welche die ableitung approximiert. dann hat aber der linke endpunkt deines intervalls nur einen rechten nachbarn, der rechte endpunkt deines intervalls nur einen linken nachbarn. man kann also schonmal nicht denselben differenzenquotient für alle punkte, an denen die ableitung gesucht ist, berechnen, außer du hast unendlich lange intervalle.

es gibt viele verschiedene methoden die ableitung zu approximieren, und es ist nie klar ob diese methode für dein spezielles problem angemessen ist.

weiterhin ist ableiten numerisch sehr schwer, da man eine kleine zahl (im nenner, differenz zweier ähnlich-großer funktionswerte, f(x)-f(x0)) durch eine kleine zahl (abstand der stützstellen, x-x0) teilt. dabei kann einiges schief gehen. stichwort: auslöschung.

dagegen ist beim integrieren (nicht stammfunktion bilden) die theorie sehr gut und numerisch gut umsetzbar.

bei den komplizierteren aufgaben muss man eben problem-angepasst programmieren. es ist wohl nicht möglich eine "schlaue" ableitungsfunktion zu programmieren.

dennoch gibt es "einfache" möglichkeiten, die den meisten nutzern schon genügen würden:

du musst nur etwas in der art machen:

angenommen du hast einen vektor mit den stützstellen, zB X=[0:0.1:1] und einen weitere vektor mit den zugehörigen funktionswerten, zB F=[1:-0.1:0], das ergäbe die funktion f(x)=-x+1 auf dem intervall [0,1]. dann bildest du den differenzenquotient mit hilfe von diff:

diff(F)/diff(X)

dabei macht diff die differenzen aufeinanderfolgender elemente, also diff([0,1,2]) = [1,1].

beachte, dass hierbei, da die 2 keinen rechten nachbarn mehr hat, das ergebnis eins kürzer ist als das argument.

mit obigen X und F ergäbe das näherungsweise die ableitung (ist -1, hier sogar exakt, weil die funktion nur linear ist)  auf dem intervallk [0.1,1]. die 0 fehlt, da sie mit dem nachbarn 0.1 zusammen nur einen datenpunkt für die ableitung liefert.

wenn du nun funktionen hast mit handles, dann hast du kein beschränktes intervall, kannst also immer den rechten nachbarn finden. allerdings kannst du keinen unendlich langen vektor aufbauen! du kannst das dann nur stückweise und damit leider auch erstmal mit einer for-schleife, solange dir nichts klügeres einfällt um die ableitung für alle gewählten stücke zu berechnen. dies ist in matlab sehr langsam, wohl ein weiterer grund warum keine "schlaue" ableitungsfunktion existiert. es gibt einfach probleme mit dem unendlich langen intervall.

die grundlegende formel für dich ist dann

(f(x)-f(x-dx))/dx,

wobei x ein punkt ist, dx ein abstand zum (hier) linken nachbarn (so wird die ableitung am punkt x mit rückwärts-gerichtetem differenzenquotienten approximiert, was standard ist).

wenn du das vektorisiert machen möchtest, also nicht für jeden punkt einzeln, dann muss deine funktion definiert sein, sodass sie mit vektor-eingaben klar kommt, zB f=@(x) x.^2 wäre x^2 mit komponentenweisem ^. dann ist f([0,2]) = [0,4] wieder ein vektor mit den entsprechenden ergebnissen. dann kann man wieder mit diff arbeiten:

diff(f([...])./diff([...]), wobei natürlich beide male das [...] derselbe vektor sein soll. dann hast du aber wieder auf einem beschränkten intervall die ableitung, also auf einer menge von punkten. die ableitungsfunktion selbst wirst du nie erhalten.

ich hoffe ich habe dir verständlich gemacht, warum du den befehl selber schreiben musst!


charles2520  04.08.2017, 12:18

Für den Ableitungsfall hat MatLab in seiner Dokumentation unter "Differentiation" eine gute Lösung parat. Der Fragesteller wollte übrigens eine Funktion mit mehreren Parametern nach einem abgeleitet haben.

Dafür bietet MatLab auch Hilfe und zwar mit symbolischen Variabeln:

syms x,y

f= sin(x)+y

und jetzt kann mit diff die exakte Ableitung nach einem Parameter berechnet werden:

nach_x_abgeleitet=diff(f,x)

Matlab gibt dann die Ableitung in Abhängigkeit von Parameter x aus. Wenn man für x dann noch einen Wert einsetzen möchte und somit eine Zahl als Lösung möchte, macht man noch folgendes:

lsg=vpa(subs(nach_x_abgeleitet,x,5))

Für x=5