DMUG-Archiv 2003

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Taylorentwicklung für mehrere Veränderliche ..

Hallo Winfried,

der guten Ordnung halber sind dennoch 3 Fehler in meinem Posting zu korrigieren: (1) das Multinomial[Sequence @@ oo] in bilgicTaylor muss ersatzlos gestrichen werden
(2) in der Formel fuer exp(x0.d)f sind Schreibfehler, also korrekt
f[x + x0] = exp(x0.d) f = f[x] + (x0.d) f/1! + (x0.d)^2f/2! + (x0.d)^3f/3! + ... + R. (3) die Ableitungen werden an der Stelle x genommen, natuerlich, denn man will die bei x bekannte Funktion nach x + x0 mittels der Ableitungen extrapolieren. Die eigentlichen Variablen in bilgicTaylor sind zeroL, während der Punkt, um den entwickelt wird, durch varL gegeben ist. Oder, mit anderen Worten:

bilgicTaylor[f_, varL_List?VectorQ, zeroL_List?VectorQ, degree_Integer?
   NonNegative] :=
 Module[{X, tPD},
     (* total preDifferential *)
     X /: X[o_List]^n_Integer := Product[X[o], {i0, n}];
     X /: X[o_List] X[p_List] := X[o + p];
     tPD = Plus @@ (zeroL×Thread[X[Sort[
     Permutations[Join[{1}, Table[0, {Length[zeroL] - 1}]]],
       Flatten[Position[#, 1] &]]]]);
     (* result *)
     f[Sequence @@ varL] + Sum[Expand[tPD^d]/d!, {d,
1, degree}] //. X[oo_List] \[RuleDelayed] Derivative[Sequence @@ oo][
     f][Sequence @@ varL]
     ] /; Length[varL] == Length[zeroL]

Mit den besten Gruessen
Udo.

Winfried Bilgic wrote:

Hallo Udo,

vielen vielen Dank, sehr flott und recht elegant...

Dankende Grüße

Winfried

On 21.12.2003, at 14:31, Udo und Susanne Krause wrote:

Hallo Winfried,

diese Aufgabe ist fuer Funktionen von 0 < n < \infty Veraenderlichen nicht sehr kompliziert.
Man kann dazu die Funktion bilgicTaylor (:-)) verwenden:

Remove[bilgicTaylor];
bilgicTaylor[f_, varL_List?VectorQ, zeroL_List?VectorQ,
   degree_Integer?NonNegative] :=
 Module[{X, tPD},
     (* total preDifferential *)
     X /: X[o_List]^n_Integer := Product[X[o], {i0, n}];
X /: X[o_List] X[p_List] := Multinomial[Sequence @@ (o + p)] X[o + p];
     tPD = Plus @@ (zeroL×Thread[X[Sort[
     Permutations[Join[{1}, Table[0, {Length[zeroL] - 1}]]],
       Flatten[Position[#, 1] &]]]]);
     (* result *)
     f[Sequence @@ zeroL] +
     Sum[Expand[tPD^
d]/d!, {d, 1, degree}] //. X[oo_List] \[RuleDelayed] Derivative[Sequence @@ \
oo][f][Sequence @@ varL]
     ] /; Length[varL] == Length[zeroL]

Die Mathekladden des ersten Semesters sagen, dass (x und x0 als Vektoren zu verstehen, das totale Differential d ebenso)
f[x + x0] = exp(x0 d) f  = f[x0] + df /1! + d^2f/2! + ... + d^mf/m! + R,
wobei R das Restglied ist.
Damit man nicht zu Anfang mühsam mit Sequences in Derivative rechnen muss, bildet man zuerst einen nahrhaften untaetigen Operator X mit einem Listenargument, sammelt dann alle Ausdruecke fuer das totale preDifferential tPD, bildet die gewuenschten Summanden des Exponentials und ersetzt X bei der Ausgabe durch den richtigen Ausdruck. Beispiele sind in dem beiliegenden Notebook. Sie muessten darueberhinaus dafuer sorgen, dass Ihre Funktion f an der Stelle zeroL abgeleitet wird.

Mit den besten Gruessen
Udo.

<taylorBilgic.nb>




Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html