Newtonverfahren < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 01:03 Fr 26.04.2013 | Autor: | mikexx |
Aufgabe | Das Newton-Verfahren versucht, eine Nullstelle der Funktion $f(x)$ zu bestimmen. Je nach Startschätzung [mm] $x_0$ [/mm] können verschiedene Nullstellen gefunden werden:
[mm] $x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}, [/mm] n>0$
Programmieren Sie das Newton-Verfahren als MATLAB-Funktion, der Sie die Funktion $f(x)$ und die Startschätzung [mm] $x_0$ [/mm] übergeben können. Bestimmen Sie die Nullstelle x so genau, daß [mm] $\lvert f(x)\rvert<10^{-5}$. [/mm] Approximieren Sie die Ableitung durch [mm] $f'(x)\approx \frac{f(x+\varepsilon)-f(x-\varepsilon)}{2\varepsilon}$ [/mm] mit [mm] $\varepsilon=10^{-7}$. [/mm] |
Hey, ich hab das so gemacht:
1: | function [x,m]=newton(h,x0)
| 2: | % h=@(x) anonym_function // x0 Startwert // x Nullstelle // m Durchgaenge
| 3: | q=10e-07;
| 4: | y=x0;
| 5: | n=0;
| 6: | while abs(h(y))>=10e-05
| 7: | n=n+1;
| 8: | k=(h(y+q)-h(y-q))/(2*q);
| 9: | y=y-((h(y))/(k));
| 10: | end
| 11: | x=y;
| 12: | m=n; |
Wenn ich das jetzt mal teste mit
1: | h=@(x)sin(x);
| 2: | [a,b]=newton(h,2) | ,
ergibt sich a=3.1416 und b=5.
Aber das kommt irgendwie nicht hin, denn es ist nicht
[mm] $\lvert \sin(3.1416)\rvert [/mm] < [mm] 10^{-5}$.
[/mm]
Wo hab ich aber was falsch gemacht?
Oder liegt es irgendwie an der Rundung oder so?
Ganz viele Grüße
|
|
|
|
> Das Newton-Verfahren versucht, eine Nullstelle der Funktion
> [mm]f(x)[/mm] zu bestimmen. Je nach Startschätzung [mm]x_0[/mm] können
> verschiedene Nullstellen gefunden werden:
>
> [mm]x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}, n>0[/mm]
>
>
> Programmieren Sie das Newton-Verfahren als MATLAB-Funktion,
> der Sie die Funktion [mm]f(x)[/mm] und die Startschätzung [mm]x_0[/mm]
> übergeben können. Bestimmen Sie die Nullstelle x so
> genau, daß [mm]\lvert f(x)\rvert<10^{-5}[/mm]. Approximieren Sie
> die Ableitung durch [mm]f'(x)\approx \frac{f(x+\varepsilon)-f(x-\varepsilon)}{2\varepsilon}[/mm]
> mit [mm]\varepsilon=10^{-7}[/mm].
> Hey, ich hab das so gemacht:
>
> 1: | function [x,m]=newton(h,x0)
| 2: | > % h=@(x) anonym_function // x0 Startwert // x Nullstelle
| 3: | > // m Durchgaenge
| 4: | > q=10e-07;
| 5: | > y=x0;
| 6: | > n=0;
| 7: | > while abs(h(y))>=10e-05
| 8: | > n=n+1;
| 9: | > k=(h(y+q)-h(y-q))/(2*q);
| 10: | > y=y-((h(y))/(k));
| 11: | > end
| 12: | > x=y;
| 13: | > m=n; |
>
> Wenn ich das jetzt mal teste mit
>
> 1: | h=@(x)sin(x);
| 2: | > [a,b]=newton(h,2) | ,
>
> ergibt sich a=3.1416 und b=5.
>
> Aber das kommt irgendwie nicht hin, denn es ist nicht
>
> [mm]\lvert \sin(3.1416)\rvert < 10^{-5}[/mm].
>
>
> Wo hab ich aber was falsch gemacht?
>
> Oder liegt es irgendwie an der Rundung oder so?
Hallo mikexx,
mein Rechner sagt mir:
$\ |sin(3.1416)| [mm] \le [/mm] 7.35 * [mm] 10^{-6}$
[/mm]
Daraus folgt auch $\ |sin(3.1416)| [mm] \le 10^{-5}$
[/mm]
Vielleicht wäre es aber trotzdem sinnvoll, bei
dem angezeigten Lösungswert eine Dezimale mehr
darstellen zu lassen, wenn du ja auch beim
Funktionswert eine Präzision von [mm] 10^{-5}
[/mm]
verlangst.
LG , Al-Chw.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:53 Fr 26.04.2013 | Autor: | mikexx |
Hallo und danke.
Ich habe zur Kontrolle so einen blöden Onlinerechner benutzt; hätte ich es gleich mit Matlab kontrolliert, hätte ich gar nicht nachfragen müssen.
Ich freue mich, daß mein Programm dann doch korrekt ist.
|
|
|
|