Potenzreihe berechnen

hallo.

hört sich nach mathematik an, aber ich glaube, daß es in dieses brett besser paßt:
ich bin in die verlegenheit geraten, eine potenzreihe der form

y = y0 * (1 - t/T)^x

in einem mikrocontroller berechnen zu müssen.

x = 0, 0.1, 0.2, … 4

das ganze über eine potenzreihenentwicklung aus dem schulbuch zu machen geht natürlich, ist aber nur soweit genau, bis die funktion die krümmung ändert.
um über den gesamten relevanten bereich ausreichend genau zu sein, bräuchte ich zig weitere glieder, die zur laufzeit zu berechnen utopisch ist.

eine LUT haut auch nicht hin, weil T variabel ist. für jede T-x-kombination eine LUT anzulegen ist wieder utopisch.

außer bei jedem start des controllers EINmal die tabelle für die aktuell gültige T-x-kombination zu berechnen fällt mir nix schlaues ein.

habt ihr irgendwelche tips für mich?

gruß

michael

Hallo,

hört sich nach mathematik an, aber ich glaube, daß es in
dieses brett besser paßt:
ich bin in die verlegenheit geraten, eine potenzreihe der form

y = y0 * (1 - t/T)^x

in einem mikrocontroller berechnen zu müssen.

x = 0, 0.1, 0.2, … 4

das ganze über eine potenzreihenentwicklung aus dem schulbuch
zu machen geht natürlich, ist aber nur soweit genau, bis die
funktion die krümmung ändert.
um über den gesamten relevanten bereich ausreichend genau zu
sein, bräuchte ich zig weitere glieder, die zur laufzeit zu
berechnen utopisch ist.

Du kannst es doch recht direkt berechnen. Für jedes t/T musst du nur einmal (1-t/T)^0.1 berechnen (es gibt einige recht schnelle iterative Verfahren um die Wurzel zu berechnen - das sollte sich auf eine 10. Wurzel verallgemeinern lassen), danach kannst du alle anderen Werte daraus als Integerpotenzen berechnen, also z.B.

(1-t/T)^1.6 = ((1-t/T)^0.1)^16

und Integerpotenzen sind schön einfach als Multiplikationen berechenbar.
Ist zwar numerisch nicht besonders stabil (befürchte ich), aber kommt mit max. 8 Multiplikationen pro Wert aus (wenn ich mich nicht verzählt habe)

eine LUT haut auch nicht hin, weil T variabel ist. für jede
T-x-kombination eine LUT anzulegen ist wieder utopisch.

Was ist LUT? :wink:

Grüße,
Moritz

hallo moritz.

Du kannst es doch recht direkt berechnen. Für jedes t/T musst
du nur einmal (1-t/T)^0.1 berechnen (es gibt einige recht
schnelle iterative Verfahren um die Wurzel zu berechnen - das
sollte sich auf eine 10. Wurzel verallgemeinern lassen),
danach kannst du alle anderen Werte daraus als Integerpotenzen
berechnen, also z.B.

hmmm… dem werd ich mal nachgehen. meine letzte iterative wurzelberechnung war eine quadratwurzel, und das is 15 jahre her :smile:

Was ist LUT? :wink:

Look Up Table :wink: um rechenzeit zu sparen, macht man sich eine tabelle mit den ergebnissen komplizierter berechnungen. ist sehr gebräuchlich z.b. für winkelfunktionen.

gruß

michael

Hossa :smile:

ich bin in die verlegenheit geraten, eine potenzreihe der form

y = y0 * (1 - t/T)^x

in einem mikrocontroller berechnen zu müssen.

x = 0, 0.1, 0.2, … 4

Im Kern besteht dein Problem also darin, einen Ausdruck der Form

f(t)=\left(1-t/T\right)^{0,1}

zu berechnen. Danach hast du im Exponenten eine ganze Zahl zwischen 1 und 40, so dass du mit einfacher Multiplikation weiter arbeiten kannst.

Die Taylor-Entwicklung für eine Funktion f um einen Wert z_0 herum lautet allgemein:

f(z_0+z)=\sum_{k=0}^\infty f^{(k)}(z_0)\cdot\frac{z^k}{k!}

Übertragen auf deinen Fall wäre dann:

z_0=1\quad;\quad z:=-\frac{t}{T}\quad;\quad f(x):=x^{0,1}

Zur Berechnung benötigen wir zunächst die Ableitungen von f(x):

f^{(0)}(x)=x^\frac{1}{10}
f^{(1)}(x)=\frac{1}{10}\cdot x^{-\frac{9}{10}}
f^{(2)}(x)=-\frac{1\cdot9}{100}\cdot x^{-\frac{19}{10}}
f^{(3)}(x)=\frac{1\cdot9\cdot19}{1000}\cdot x^{-\frac{29}{10}}
f^{(4)}(x)=-\frac{1\cdot9\cdot19\cdot29}{10^4}\cdot x^{-\frac{39}{10}}
f^{(5)}(x)=\frac{1\cdot9\cdot19\cdot29\cdot39}{10^5}\cdot x^{-\frac{49}{10}}
\cdots

Es ist klar, wie das weitergeht. Speziell an der Stelle x=1 gilt:

f^{(0)}(1)=+1
f^{(1)}(1)=+\frac{1}{10}
f^{(2)}(1)=-\frac{1\cdot9}{100}
f^{(3)}(1)=+\frac{1\cdot9\cdot19}{1000}
f^{(4)}(1)=-\frac{1\cdot9\cdot19\cdot29}{10^4}
f^{(5)}(1)=+\frac{1\cdot9\cdot19\cdot29\cdot39}{10^5}
\cdots

Die einzelnen Terme der Taylorentwicklung lauten daher:

f^{(0)}(1)\cdot\frac{z^0}{0!}=+1
f^{(1)}(1)\cdot\frac{z^1}{1!}=
+\frac{1}{10}\cdot\frac{z^1}{1!}=
-\frac{1}{10}\cdot\frac{1}{1}\left(\frac{t}{T}\right)^1

f^{(2)}(1)\cdot\frac{z^2}{2!}=
-\frac{1\cdot9}{100}\cdot\frac{z^2}{2!}=
-\frac{1\cdot9}{100}\cdot\frac{1}{2}\left(\frac{t}{T}\right)^2

f^{(3)}(1)\cdot\frac{z^3}{3!}=
+\frac{1\cdot9\cdot19}{1000}\cdot\frac{z^3}{3!}=
-\frac{1\cdot9\cdot19}{1000}\cdot\frac{1}{6}\left(\frac{t}{T}\right)^3

f^{(4)}(1)\cdot\frac{z^4}{4!}=
-\frac{1\cdot9\cdot19\cdot29}{10^4}\cdot\frac{z^4}{4!}=
-\frac{1\cdot9\cdot19\cdot29}{10^4}\cdot\frac{1}{24}\left(\frac{t}{T}\right)^4

f^{(5)}(1)\cdot\frac{z^5}{5!}=
+\frac{1\cdot9\cdot19\cdot29\cdot39}{10^5}\cdot\frac{z^5}{5!}=
-\frac{1\cdot9\cdot19\cdot29\cdot39}{10^5}\cdot\frac{1}{120}\left(\frac{t}{T}\right)^5

\cdots

Alles zusammengefasst:

\left(1-\frac{t}{T}\right)^{0,1}\approx 1-
a_1\left(\frac{t}{T}\right)-
a_2\left(\frac{t}{T}\right)^2-
a_3\left(\frac{t}{T}\right)^3-
a_4\left(\frac{t}{T}\right)^4-
a_5\left(\frac{t}{T}\right)^5-\cdots

Die Koeffizienten kannst du dabei rekursiv berechnen:

a_{n+1}=a_n\cdot\frac{10n-1}{10(n+1)}\quad;\quad a_1=\frac{1}{10}

Die Koeffizienten a_i verringern sich recht langsam. Daher hängt es von der Größe (t/T) ab, wie schnell die Reihe konvergiert. Da du die Koeffizienten jedoch rekursiv berechnen kannst, ist es möglich, die Reihe so lange fortzusetzen, bis sich das Gesamtergebnis nicht mehr ändert.

Viele Grüße

hallo moritz.

Du kannst es doch recht direkt berechnen. Für jedes t/T musst
du nur einmal (1-t/T)^0.1 berechnen (es gibt einige recht
schnelle iterative Verfahren um die Wurzel zu berechnen - das
sollte sich auf eine 10. Wurzel verallgemeinern lassen),

das funktioniert wunderbar. der haken dabei ist, daß 1-t/T

hallo stefan.

das sieht zumindest in excel ganz brauchbar aus.
ich bin auf die laufzeit gespannt :smile:

danke & gruß

michael