Zurück zum Inhaltsverzeichnis

Kapitel 16

Differenzieren von Ausdrücken

Für das Differenzieren gibt es zwei Befehle: diff() für Ausdrücke (Terme) und den D-Operator für Funktionen.

Ausdrücke werden mit diff(term,var) partiell nach der im zweiten Argument angegebenen Variablen abgeleitet:

> Diff(a*x^3+b*x^2+c*x,x)=diff(a*x^3+b*x^2+c*x,x);

Diff(a*x^3+b*x^2+c*x,x) = 3*a*x^2+2*b*x+c

> Diff(a*x^3+b*x^2+c*x,a)=diff(a*x^3+b*x^2+c*x,a);

Diff(a*x^3+b*x^2+c*x,a) = x^3

>

>

Da der Ausdruck meistens im Zusammenhang mit einer Funktion vorkommt (als Funktionsterm), ist eine korrekte Handhabung erforderlich, bzw. es gibt eine Reihe von Fehlerquellen:

> term:=x^2;

term := x^2

> diff(term,x);

2*x

Bildet man aus dem Term (nach der frühen Bindung) eine Funktion, so sollte man unapply() verwenden und nicht die Pfeilschreibweise:

> funktion:=unapply(term,x);

funktion := proc (x) options operator, arrow; x^2 e...

> pfeil:=x->term;

pfeil := proc (x) options operator, arrow; term end...

> funktion(etwas); pfeil(etwas);

etwas^2

x^2

Die Zuordnung ist in pfeil() immer x^2, deshalb erhält man nur für diese Variable die richtige Ableitung:

> diff(funktion(z),z); diff(pfeil(etwas),x); diff(pfeil(x),etwas);

2*z

2*x

0

Eine weitere Fehlerquelle ist es, nur den Funktionsnamen zu erwähnen, der dann als Term interpretiert wird:

> diff(funktion,x); diff(pfeil,x); diff(pfeil,pfeil);

0

0

1

>

Ableitung an einer Stelle

> eval(Diff(x^3+x^2+x,x),x=0)=eval(diff(x^3+x^2+x,x),x=0);

eval(Diff(x^3+x^2+x,x),{x = 0}) = 1

> subs(x=0,diff(x^3+x^2+x,x));

1

Auch hier gibt es Stolpersteine, weil sich das Ableiten und das Einsetzen nicht vertauschen lassen

> su:=subs(x=0,diff(f(x),x));

su := diff(f(0),0)

> ev:=eval(diff(f(x),x),x=0);

ev := eval(diff(f(x),x),{x = 0})

> f:=sin; ev; su;

f := sin

1

Error, wrong number (or type) of parameters in function diff

> f:='f':

> (x->diff(x^2,x))(1);

Error, (in unknown) wrong number (or type) of parameters in function diff

> (x->diff(x^2,x))(etwas);

2*etwas

> unapply(diff(x^2,x),x)(1);

2

Merke: Mit unapply() und eval() ist man auf der sicheren Seite, während die Pfeilschreibweise und subs() zu unbeabsichtigten Ergebnissen führen können.

>

>

Höhere Ableitungen

> diff(x^3+x^2+x,x,x);

6*x+2

Oder kürzer mit dem $-Operator

> diff(x^3+x^2+x,x$3);

6

>

Bei automatisierten Berechnungen empfiehlt sich die Variante diff(term, [vars]), mit der auch eine leere Variablenliste angegeben werden kann:

> for var in [[],[x],[x,x]] do

> diff(x^3+x^2+x,var); od;

x^3+x^2+x

3*x^2+2*x+1

6*x+2

> seq(diff(x^3,[x$i]),i=-2..5);

x^3, x^3, x^3, 3*x^2, 6*x, 6, 0, 0

>

Ableitungsregeln

> diff(a*f(x)+b*g(x),x);

a*diff(f(x),x)+b*diff(g(x),x)

> diff(f(x)*g(x),x);

diff(f(x),x)*g(x)+f(x)*diff(g(x),x)

> simplify(diff(f(x)/g(x),x));

(diff(f(x),x)*g(x)-f(x)*diff(g(x),x))/(g(x)^2)

> diff( f(g(x)), x);

D(f)(g(x))*diff(g(x),x)

Bei der Kettenregel erscheint der D-Operator für die vollständige Ableitung (s.u.).

>

>

Differenzieren von Ausdrücken mit mehreren Variablen

Die Variablen nach denen abgeleitet wird, werden als unabhängig betrachtet

> diff( (x^2+y^3)^4, x, y);

72*(x^2+y^3)^2*x*y^2

> diff( (x^2+y^3)^4, x);

8*(x^2+y^3)^3*x

Abhängigkeiten könnnen z.B. mit y(x) formuliert werden

> diff( (x^2+y(x)^3)^4, x);

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

> alias(y=y(x)):

> diff( (x^2+y^3)^4, x);

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

> alias(y=y);

> diff( f(x,y,z), x$2,y,z$2);

diff(f(x,y,z),`$`(x,2),y,`$`(z,2))

>

> diff( f(x,z), x$2,y,z$2);

0

>

>

Ableitungsregeln definieren

Ein kleines Beispiel

> restart;

> `diff/f` := proc(x,dx) -f(2*x) * dx; end:

> diff( f(x), x);

-f(2*x)*x

> diff(f(x), y);

0

> diff( f(n), n$3);

-f(8*n)*n^3+3*f(4*n)*n

>

>

Implizite Differentiation

Wenn die Abhängigkeit von Variablen implizit definiert ist

> f:=x^2+y^2=1;

f := x^2+y^2 = 1

erhält man mit implicitdiff() die Ableitung

> implicitdiff(f,y,x);

-x/y

ebenfalls implizit aber ohne Umwege:

> solve(f,y);

sqrt(1-x^2), -sqrt(1-x^2)

> diff(%[1],x);

-x/(sqrt(1-x^2))

Ausführlicher

> implicitdiff({f},{y(x)},{y},x);

{D(y) = -x/y}

> implicitdiff({f},{y(x)},{y},x, notation=Diff);

{Diff(y,x) = -x/y}

Das gleiche Resultat mit diff and solve (diff läßt sich auch auf Gleichungen anwenden):

> diff(x^2+y(x)^2=1,x);
solve(%, diff(y(x),x));

2*x+2*y(x)*diff(y(x),x) = 0

-x/y(x)

>

Höhere implizite Ableitungen

> f:= x^2*y^2*z^2=1:

> implicitdiff(f,z,x,y);

z/(x*y)

> implicitdiff({f}, {z(x,y)}, {z}, x,y);

{D[1,2](z) = z/(x*y)}

> implicitdiff({f}, {z(x,y)}, {z}, x,y, notation=Diff);

{Diff(z,x,y) = z/(x*y)}

>

Der Operator D

Der D-Operator erzeugt aus einer Funktion eine Funktion

> restart:

> D(x->x^2);

proc (x) options operator, arrow; 2*x end proc

> D(x->x^2)(etwas);

2*etwas

> D(x->x^2)(5);

10

Mit Namensgebung

> y:=x->x^4;

y := proc (x) options operator, arrow; x^4 end proc...

> ys:=D(y);

ys := proc (x) options operator, arrow; 4*x^3 end p...

> ys(9);

2916

Oder für vordefinierte Funktionen

> D(sin);

cos

Die Ordnung der Ableitung wird mit @@ angegeben

> yss:=(D@@2)(y);

yss := proc (x) options operator, arrow; 12*x^2 end...

> z:=(D@@0)(y)(10);

z := 10000

Aber nicht

> yss:=(D$2)(y);

yss := proc (x) options operator, arrow; 4*x^3 end ...

sondern (s.u. Funktionen von mehreren Variablen)

> z:=D[1$2](y);

z := proc (x) options operator, arrow; 12*x^2 end p...

> z(8);

768

> z:=D[](y);

> z(8);

z := y

4096

>

Weil für die Anwendung von Funktionsvorschriften folgende Regeln gelten

> (f+g)(x), (f*g)(x), (f/g)(x), (f@g)(x), 5(x);

f(x)+g(x), f(x)*g(x), f(x)/g(x), f(g(x)), 5

lauten die Ableitungsregeln

> D(f+g);

D(f)+D(g)

> D(f*g);

D(f)*g+f*D(g)

> simplify(D(f/g));

-(-D(f)*g+f*D(g))/(g^2)

> D(f@g);

`@`(D(f),g)*D(g)

Und nicht

> D(f(g));

D(f(g))

> D(5);

0

>

Funktionen von mehreren Veränderlichen

> f:=(x,y)->sin(x)+cos(y)+sin(x*y);

f := proc (x, y) options operator, arrow; sin(x)+co...

> D[1](f);

proc (x, y) options operator, arrow; cos(x)+cos(x*y...

> D[2](f);

proc (x, y) options operator, arrow; -sin(y)+cos(x*...

> D[2](f)(alpha,beta);

-sin(beta)+cos(alpha*beta)*alpha

> D[2$2](f);

proc (x, y) options operator, arrow; -cos(y)-sin(x*...

> D[1$3,2$4](f);

proc (x, y) options operator, arrow; -cos(x*y)*y^3*...

> diff( f(x,y), x$3, y$4);

-cos(x*y)*x^4*y^3-12*sin(x*y)*x^3*y^2+36*cos(x*y)*x...

>

>

Konvertierung zwischen diff and D

> restart:

> diff( f(x,y,z), x,y,z$2);

diff(f(x,y,z),x,y,`$`(z,2))

> convert(%, D);

D[1,2,3,3](f)(x,y,z)

> lprint(%);

D[1,2,3,3](f)(x,y,z)

> convert(%, diff);

diff(f(x,y,z),x,y,`$`(z,2))

> lprint(%);

diff(diff(diff(diff(f(x,y,z),x),y),z),z)

>

>

Prozeduren differenzieren

> f := proc(x) local t0,t1,t2;
t0 := sin(x): t1 := cos(x):
t2 := (t0^2+t1+3)/(t1^3-t0);
sin(t2^2+1)*cos(t2^2-1);
end:

> f(x);

sin((sin(x)^2+cos(x)+3)^2/((cos(x)^3-sin(x))^2)+1)*...

>

Ableiten des Funktionsterms mit diff

> fd1:=diff(f(x), x);

fd1 := cos((sin(x)^2+cos(x)+3)^2/((cos(x)^3-sin(x))...
fd1 := cos((sin(x)^2+cos(x)+3)^2/((cos(x)^3-sin(x))...
fd1 := cos((sin(x)^2+cos(x)+3)^2/((cos(x)^3-sin(x))...
fd1 := cos((sin(x)^2+cos(x)+3)^2/((cos(x)^3-sin(x))...
fd1 := cos((sin(x)^2+cos(x)+3)^2/((cos(x)^3-sin(x))...

>

Erzeugen einer Prozedur für die Ableitung mit D

> fd2:=D(f);

fd2 := proc (x) local t0, t2, t1, t1x, t2x, t0x; t0...
fd2 := proc (x) local t0, t2, t1, t1x, t2x, t0x; t0...
fd2 := proc (x) local t0, t2, t1, t1x, t2x, t0x; t0...
fd2 := proc (x) local t0, t2, t1, t1x, t2x, t0x; t0...
fd2 := proc (x) local t0, t2, t1, t1x, t2x, t0x; t0...
fd2 := proc (x) local t0, t2, t1, t1x, t2x, t0x; t0...
fd2 := proc (x) local t0, t2, t1, t1x, t2x, t0x; t0...
fd2 := proc (x) local t0, t2, t1, t1x, t2x, t0x; t0...
fd2 := proc (x) local t0, t2, t1, t1x, t2x, t0x; t0...
fd2 := proc (x) local t0, t2, t1, t1x, t2x, t0x; t0...

>

Zurück zum Inhaltsverzeichnis