Numerische Ableitung < Integr.+Differenz. < Numerik < Hochschule < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 10:50 Do 14.07.2005 | Autor: | Neruda |
Hallo,
ich habe ein Array von 2500 Datenpunkten, die eine Rampe darstellen, also eine Art "Sprungfunktion mit abgerundeten Ecken". Ich will dieses Array zweimal numerisch ableiten, wobei ein bipolares Signal zu erwarten waere. ich verwende dazu die Funktion:
1: |
| 2: | void Ableitung(Double_t* input, Double_t* output, Int_t mm)
| 3: | {
| 4: | Int_t h= 1;
| 5: |
| 6: | for (Int_t n=(-1+h); n<(mm-h); n++)
| 7: | {
| 8: | output[n]= (input[n+h]-2*input[n]+input[n-h])/(h*h);
| 9: | }
| 10: |
| 11: | cout << "Zweifache Ableitung abgeschlossen" << endl;
| 12: | }
|
wobei input natuerlich das urspruengliche Array ist, und output das Array der zweifachen Ableitung. Leider ist dieser Weg falsch, den das output Array zeigt alles andere als das, was es soll, es sei denn man erhoeht den Wert h, was allerdings bei nachfolgenden Rechnungen Fehler nach sich zieht.
Kann mir jemand Weiterhelfen?
Danke, Neruda
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Hallo Neruda,
Du startest Deine Schleife mit n=0 dabei wird dann input[-1] aufgerufen das kann alles mögliche sein. Das ist nat. egal wenn Dir klar ist das in output[0] und output[mm-1] nicht die 2.Ableitung drinsteht. Damit der Wert auch zu den Daten passt, also schon richtig skaliert ist und nicht nur qualitativ stimmt, könntest Du noch die richtige Schrittweite(h) übergeben.
Also so
1: |
| 2: | void Ableitung(Double_t* input, Double_t* output, Int_t mm,Double_t h)
| 3: | {
| 4: | for (Int_t n=1; n<(mm-1); n++)
| 5: | output[n]= (input[n+1]-2*input[n]+input[n-1])/(h*h);
| 6: | }
| 7: | |
Aber direkt anders ist das nicht wie wird's denn verwendet?
viele Grüße
mathemaduenn
|
|
|
|
|
Die Ergebnisse werden besser, wenn du den Wert voh $h$ erhöhst. Das kommt daher, dass die Differentiation bei gestörten (verrauschten) Daten schlecht gestellt ist.
z.B. betrachte die Aufgabe, eine Funktion $f$ numerisch zu differenzieren. Solange die Eingangsdaten exakt sind, funktioniert das einwandfrei. Hat man aber als Eingangsdaten eine verrauschte Funktion [mm] $\tilde{f}(x)=f(x)+ \epsilon \sin(n\cdot [/mm] x)$, dann erhält man als Ergebnis [mm] $\tilde(f)'(x)=f'(x)+n\cdot \epsilon \cos(nx)$. [/mm] Hochfrequente Störungen [mm] ($n\to\infty$) [/mm] verfälschen also das Ergebnis.
Die "Störung" [mm] $\epsilon \sin(n\cdot [/mm] x)$ kann man dadurch "eliminieren", dass man die Schrittweite erhöht.
Der Fehler des Verfahrens lässt sich in zwei Teilfehler aufspalten:
1) Den Verfahrensfehler, der geht gegen $0$, wenn man $h$ gegen Null gehen lässt.
2) Den Datenfehler, der aus gestörten Meßdaten entsteht. Der geht gegen $0$, wenn $h$ groß ist.
D.h. die optimale Schrittweite liegt irgendwo zwische $0$ und "$h$ groß".
Experimentier einfach mal mit verschiedenen Werten von $h$.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:30 Di 26.07.2005 | Autor: | Neruda |
Danke fuer Deine Antwort,
mit ein bisschen herumspielen und noch ein-zwei anderen Tricks habe ich mein Problem weitenstgehend zufriedenstellend loesen koennen.
Mich wuerde aber noch interessieren, wie man es am besten beweisen kann, dass das Rauschen mit Erhoehung des Stuetzstellenabstandes kleiner wird. Ich habe es zwar schon selbst versucht, indem ich die gestoerte Funktion f'(x)=f(x)+ [mm] \varepsilon [/mm] sin(nx) in die Formel fuer die zweite Ableitung eingesetzt habe, aber so einfach scheint das dann doch nicht zu sein, oder ich sehe den entscheidenden Schritt nicht. Kannst Du mir vielleicht einen Hinweis geben? Z.B. ein Link im Internet?
Danke nochmal!
|
|
|
|
|
Hallo Neruda,
Das mit der sinsstörung sollte vermutlich nur ein "Bild" sein. Ein "Rauschen" beschreibt man eigentlich über eine Normalverteilung.
[mm]f^{\sim}( x_i )=f(x_i)+\epsilon_i [/mm] wobei [mm] \epsilon_i\sim N(0,\sigma)
[/mm]
Dann kann man sich überlegen welche Verteilung der Fehler des Ergebnisses haben muß.
Wenn deine Eingangsdaten eigentlich exakt sind und allein der Rundungsfehler einen Einfluß hat kannst Du Dich ja über "Auslöschung" informieren.
viele Grüße
mathemaduenn
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:46 Mo 01.08.2005 | Autor: | mickrau133 |
Das Beispiel mit dem Sinus habe ich gebracht, weil der Sinus differenzierbar ist. Also selbst die Addition einer differenzierbaren Störung kann die exakte Lösung so weit verändern, dass man die gestellte Aufgabe regularisieren muss. Unter einer Regularisierung eines schlecht gestellten Problems (z.B. sei der Inversionsoperator [mm] $T^{-1}$ [/mm] nicht stetig) versteht man eine Familie von Operatoren [mm] $T_\gamma^{-1}$, [/mm] so dass [mm] $T_\gamma^{-1}$ [/mm] stetig ist und in einem geeigneten Sinne gegen [mm] $T^{-1}$ [/mm] konvergiert.
Beispiel Differentiation:
1) Der exakte Inversionsoperator einer Integralgleichung [mm] $g(x)=\int_0^{x}f(t)\, [/mm] dt$ ist die Differentiation $f(x)=g'(x)$.
2) Die Differentiation ist unstetig (als Operator von [mm] $(C^1,\|\cdot\|_\infty)$ [/mm] nach [mm] $(C^1,\|\cdot\|_\infty)$. [/mm] Die numerische Differentiation ist dagegen stetig und konvergiert mit [mm] $\gamma:=h\to [/mm] 0$ gegen den exakten (aber unstetigen) Inversionsoperator.
Nun zu der ursprünglichen Frage:
Das Beispiel sei wie oben, berechne $g'(x)$ numerisch durch
[mm] \begin{equation}
D_hg(x)=\frac{g(x+h)-g(x-h)}{2h}, h>0\ .
\end{equation}
[/mm]
Taylor liefert
[mm] \begin{equation}
g(x+h)=g(x)+hg'(x)+\frac{h^2}{2}g''(x)+\frac{h^3}{6} g'''(\xi)\ ,
\end{equation}
[/mm]
$g(x-h) analog.
Fehlerabschätzung
[mm] \begin{equation}
|g'(x)-D_hg(x)|\leq \frac{h^2}{6}\max_{\xi\in[x-h,x+h]}|g'''(\xi)|\ .
\end{equation}
[/mm]
Also wegen $f=g'$
[mm] \begin{equation}
\|f-D_hg\|_\infty \leq \frac{h^2}{6}\|f''\|_infty \ .
\end{equation}
[/mm]
Wendet man den zentralen Differenzenquotienten auf gestörte Daten [mm] $g^\epsilon$ [/mm] mit [mm] $\|g^\epsilon -g\|_\infty \leq \epsilon$ [/mm] an, dann gilt für den Datenfehler
[mm] \begin{equation}
|D_h(g^\epsilon -g)(x)|\leq \frac{\epsilon}{h}\ .
\end{equation}
[/mm]
Für den Gesamtfehler des Verfahrens gilt
[mm] \begin{equation}
|D_h g^\epsilon(x)-f(x)| \leq \frac{h^2}{6}\|f\|_\infty+ \frac{\epsilon}{h}\ .
\end{equation}
[/mm]
Die optimale Schrittweite ist
[mm] \begin{equation}
h_{opt}=\left( \frac{3\epsilon}{\|f''\|_\infty}\right)^{1/3}\ ,
\end{equation}
[/mm]
wobei die exakte Lösung $f''$ bei numerischer Differentiation unbekannt ist.
Bem: Ich habe meinen Beitrag nicht Korrektur gelesen.
Edit: intuitiv ist die Sache klar. Stell dir vor, du sollst die Steigung einer Strasse bestimmen. Solange die Schrittweite groß genug ist, bekommst die ein sinnvolles Ergebnis (sie darf natürlich nicht zu groß sein).
Geht die Schrittweite dagegen gegen Null, so misst du irgendwann nur noch die Steigung, die durch einzelne Schottersteine verursacht wird. Und die weicht von der "tatsächlichen" Steigung ab.
|
|
|
|
|
Hallo Neruda,
> Ich habe diese Frage in keinem Forum auf anderen Internetseiten
> gestellt.
Bitte Crosspostings in verschiedenen Matheforen immer mit link angeben.
www.matheplanet.com
siehe auch:
die Forenregeln
viele Grüße
mathemaduenn
|
|
|
|