Newton-Verfahren < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Aufgabe | (a) Berechnen Sie die Nullstellen von $ p= [mm] f_1,f_7 [/mm] $ mit dem Newtonschen Verfahren.
$ [mm] x_t_+_1 [/mm] = [mm] x_t-\bruch{f(x_t)}{f'(x_t)}, [/mm] $ $ t=0,1,..., $
für die folgenden Startwerte [mm] x_0:
[/mm]
$ [mm] x_0 [/mm] = -3 $, $ [mm] x_0 [/mm] = -1,5 $ , $ [mm] x_0 [/mm] = 0 $, $ [mm] x_0 [/mm] = 1,5 $, $ [mm] x_0=3 [/mm] $
in (a) und (b) gewinnen Sie die für die Iterationsformel bzw. für [mm] s_t [/mm] benötigten Werte [mm] p(x_t),p'(x_t) [/mm] und $ [mm] \bruch{(p(x_t)-p(x_t_-_1))}{x_t-x_t_-_1} [/mm] $ jeweils mit dem Hornerschema. Hierzu beachten Sie: Mit dem P [mm] \in P_n [/mm] aus der erstem Zeile des Hornerschemas erhaltenen [mm] q_t \in P_n_1 [/mm] mit $ p = [mm] p(x_t)+(x-x_t)q_t [/mm] $ gilt $ [mm] p'(x_t) [/mm] = [mm] q(x_t) [/mm] $ und $ [mm] \bruch{p(x_t)-p(x_t_-_1)}{x_t-x_t_-_1} [/mm] $
$ [mm] f_1(x) [/mm] = [mm] x^5-0.4x^4-5x^3+2x^2+4x-1.5, [/mm] $ $ x [mm] \in \IR [/mm] $ |
Hallo,
ich habe einige Verständnisprobleme bei der Aufgabe.
Erstmal allgemein ich habe jetzt nur (a) aufgeschrieben und [mm] f_1. f_2-f_7 [/mm] kann ich ja wenn alles so weit ist mal aufschreiben.
x = -3 % Startwert
j = 5 % Anzahl der Durchläufe
for i = 1:j % Beginn der Schleife
fx = [mm] x^5-0.4*x^4-5*x^3+2*x^2+4*x-1.5; [/mm] % Funktion
dx = [mm] 5*x^4-1.6*x^3-15*x^2+4*x+4; [/mm] % Ableitung der Funktion
x = x - fx/dx % Berechnung
end
( ich wollte es per code schreiben mit den befehl [code] aber irgendwie hat es nicht hingehauen, sorry.)
Ist mein Code für das Newton-Verfahren richtig?
Und meine Probleme ich verstehe nicht was der Prof. mit dem Hornerschema meint. Ich weiß, was der Hornerschema ist, aber ich wende den doch gar nicht an im Programm, also ich brauche es doch gar nicht? :S
ich finde die Aufgabenstellung bisschen kompliziert hingeschrieben.
Ich soll doch nur die Nullstellen mit dem Newton-Verfahren berechnen oder nicht?
LG
|
|
|
|
> (a) Berechnen Sie die Nullstellen von [mm]p= f_1,f_7[/mm] mit dem
> Newtonschen Verfahren.
> [mm]x_t_+_1 = x_t-\bruch{f(x_t)}{f'(x_t)},[/mm] [mm]t=0,1,...,[/mm]
> für die folgenden Startwerte [mm]x_0:[/mm]
> [mm]x_0 = -3 [/mm], [mm]x_0 = -1,5[/mm] , [mm]x_0 = 0 [/mm], [mm]x_0 = 1,5 [/mm], [mm]x_0=3[/mm]
>
> in (a) und (b) gewinnen Sie die für die Iterationsformel
> bzw. für [mm]s_t[/mm] benötigten Werte [mm]p(x_t),p'(x_t)[/mm] und
> [mm]\bruch{(p(x_t)-p(x_t_-_1))}{x_t-x_t_-_1}[/mm] jeweils mit dem
> Hornerschema. Hierzu beachten Sie: Mit dem P [mm]\in P_n[/mm] aus
> der erstem Zeile des Hornerschemas erhaltenen [mm]q_t \in P_n_1[/mm]
> mit [mm]p = p(x_t)+(x-x_t)q_t[/mm] gilt [mm]p'(x_t) = q(x_t)[/mm] und
> [mm]\bruch{p(x_t)-p(x_t_-_1)}{x_t-x_t_-_1}[/mm]
>
> [mm]f_1(x) = x^5-0.4x^4-5x^3+2x^2+4x-1.5,[/mm] [mm]x \in \IR[/mm]
> Hallo,
> ich habe einige Verständnisprobleme bei der Aufgabe.
> Erstmal allgemein ich habe jetzt nur (a) aufgeschrieben
> und [mm]f_1. f_2-f_7[/mm] kann ich ja wenn alles so weit ist mal
> aufschreiben.
>
>
> x = -3 % Startwert
> j = 5 % Anzahl der Durchläufe
>
> for i = 1:j % Beginn der Schleife
>
> fx = [mm]x^5-0.4*x^4-5*x^3+2*x^2+4*x-1.5;[/mm] % Funktion
> dx = [mm]5*x^4-1.6*x^3-15*x^2+4*x+4;[/mm] % Ableitung
> der Funktion
>
> x = x - fx/dx % Berechnung
> end
>
> ( ich wollte es per code schreiben mit den befehl [code]
> aber irgendwie hat es nicht hingehauen, sorry.)
>
> Ist mein Code für das Newton-Verfahren richtig?
>
> Und meine Probleme ich verstehe nicht was der Prof. mit dem
> Hornerschema meint. Ich weiß, was der Hornerschema ist,
> aber ich wende den doch gar nicht an im Programm, also ich
> brauche es doch gar nicht? :S
>
> ich finde die Aufgabenstellung bisschen kompliziert
> hingeschrieben.
> Ich soll doch nur die Nullstellen mit dem Newton-Verfahren
> berechnen oder nicht?
>
> LG
Hallo Striker
Zuerst dachte ich: 7 Funktionen, jeweils für 5 verschiedene
Startwerte Newton- und Hornerverfahren durchführen:
ganz schön nahrhafte Aufgabe, an der man aber mit der
Zeit auch den Appetit verlieren könnte.
Doch es scheint, dass das nicht etwa von Hand gerechnet,
sondern programmiert werden soll. Dann ist die Menge
der Beispiele nicht mehr so abschreckend.
Der Code für die Newton-Berechnung ist korrekt.
Warum wählst du aber z.B. gerade j=5 ? Oft genügt dies
zwar - aber besser wäre eine Methode, bei der bei
jedem Schritt auf die erreichte Genauigkeit geprüft wird
und z.B. dann abgebrochen wird, wenn [mm] |x_{n+1}-x_n| [/mm] < [mm] \varepsilon
[/mm]
mit z.B. [mm] $\varepsilon=10^{-8}$ [/mm] .
Nun soll aber offenbar für die ersten beiden Teilaufgaben (a),(b)
(wo die Funktionen Polynomfunktionen sind) das Hornerschema
eingesetzt werden. Für das Programmieren heißt dies,
dass du zu diesem Zweck am besten eine kleine
Prozedur schreibst, die dann diese Berechnung als
Nebenjob übernimmt. Das ist bestimmt eine gute
Programmierübung, aber wenn du dies zum ersten Mal
machst, halt schon ein bisschen aufwendig ... (sorry, aufwändig
natürlich, weil es einige vielleicht die Wände rauf treibt ...)
LG , Al-Chwarizmi
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:07 Do 30.10.2014 | Autor: | Striker_03 |
ok danke,
ich habe nun versucht das Horner-Schema zu Programmieren.
% y Koeffizienten des Polynoms [mm] p_n-1(x)
[/mm]
% rn Wert des Polynoms [mm] p_0(x) [/mm] an der Stelle x0
% xi Koeffizienten des Polynoms [mm] p_n(x)
[/mm]
% x0 Stelle an der gerechnet wird (x=x0)
y(1)=xi(1);
for i=2:(length(xi)-1)
y(i)=y(i-1)*x0+xi(i);
end
rn=y(end)*x0+xi(end);
nur falls das jetzt richtig ist verstehe ich nicht wo ich das bei meinem Newton einsetzen könnte den code?
ja das mit der Länge j beim Newton-Verfahren schaue ich mir denn auch nochmal an.
LG
|
|
|
|
|
So habe es geändert der vorherige code war ja falsch.
function [w,q] = poly_horner(p,x0)
q=[p(1)];
for k=2:length(p)-1
q=[q,q(length(q))*x0+p(k)];
end
w=q(length(q))*x0+p(length(p));
nun läuft es zwar bei mir, aber es scheint trotzdem noch falsch zu sein.
wenn ich ein p und ein [mm] x_0 [/mm] eingebe dann kommt der Funktionswert an der Stelle [mm] x_0 [/mm] raus :S
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:10 Do 30.10.2014 | Autor: | leduart |
Hallo
ich denke das Hornerschema brauchst du, weil dein Programm sobald es ein allgemeines f kriegt, die Ableitung nicht kennt. die sollst du also wohl nicht einfach als dx in dein Ptogramm schreiben sonder numerisch bestimmen.
(das ist aber nur eine Vermutung=
Gruß leduart
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:20 Sa 01.11.2014 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|
|
Hallo Striker
endlich bin ich jetzt dazu gekommen, mir das Ganze
nochmals anzuschauen und selber ein passendes
kleines Programm zu schreiben, allerdings nicht
in MatLab, sondern in dem TI-Basic des CAS-Rechners
Voyage 200 , den ich für solche kleinen Programme
gerne einsetze.
Deine MatLab - Funktion
> function [w,q] = poly_horner(p,x0)
> q=[p(1)];
> for k=2:length(p)-1
> q=[q,q(length(q))*x0+p(k)];
> end
> w=q(length(q))*x0+p(length(p));
liefert offenbar zu einem eingegebenen Polynom (als
Liste seiner Koeffizienten) und einem Startwert x0 den
Funktionswert w und ein neues Polynom q , nämlich
genau jenes, das man bei der Polynomdivision
$\ p(x)\ :\ (x-x0)\ =\ (Polynom\ q(x))\ +\ (Restbruch)$
erhalten würde und das beim Hornerverfahren
"unter dem Strich" entsteht. Dieses Polynom
ist zwar nicht etwa die Ableitungsfunktion p'(x) ,
hat aber die besondere Eigenschaft, dass es für
den vorher eingesetzten Wert x wirklich auch
denselben Wert liefert wie die Ableitungsfunktion.
Es gilt also
$\ q(x0)\ =\ p'(x0)$
Das ist einer der guten Gründe für das "erweiterte
Horner-Schema". Und wir können es hier prima brauchen.
Eigentlich könnte man nun die Hornerfunktion aus
einer Newtonfunktion heraus zweimal abrufen,
einmal für den Funktionswert und dann für den
Ableitungswert.
Für meine kleine Funktion "polynull" in TI-Basic
habe ich das aber mit "copy, paste and modify"
gemacht. Hier das Ergebnis:
polynull(p,x0,epsilon)
Func
Local k,q,r,wert,abl
x0 [mm] \to [/mm] x
1000 [mm] \to [/mm] wert
While abs(wert) ≥ epsilon
{p [1]} [mm] \to [/mm] q
For k,2,dim(p)-1
augment(q,{q [dim(q)]*x + p [k]}) [mm] \to [/mm] q
EndFor
q [dim(q)]*x + p [dim(p)] [mm] \to [/mm] wert
{q [1]} [mm] \to [/mm] r
For k,2,dim(q)-1
augment(r,{r [dim(r)]*x + q [k]}) [mm] \to [/mm] r
EndFor
r [dim(r)]*x + q [dim(q)] [mm] \to [/mm] abl
x - wert / abl [mm] \to [/mm] x
EndWhile
Return x
EndFunc
Ich hoffe, dass du diesen Basic-Code im Wesentlichen
verstehst und in MatLab-Code "übersetzen" kannst.
Sonst stell einfach Rückfragen dazu !
Du erkennst ja sicher, dass ich deine Funktion
"poly_horner" mit verwendet habe.
Ich füge ein Beispiel an. Nehmen wir zum Beispiel
die Polynomfunktion
$\ p:\ [mm] x\,\mapsto\ x^3\ -\,4\,x^2\,-\,5\,x\,+3$
[/mm]
Die Koeffizientenliste für p ist
p = { 1 , -4 , -5 , 3 }
Nehmen wir z.B. den Startwert x0 = 2 und die
Toleranzgrenze epsilon = 0.0001 , so wäre der
Funktionsaufruf
polynull ( { 1 , -4 , -5 , 3 } , 2 , 0.0001 )
und darauf wird der (approximative) Wert einer
ersten Nullstelle angegeben: 0.45389
Für die Teilaufgaben, bei welchen gar nicht Polynom-
funktionen vorliegen, muss jeweils der Funktions-
term vorliegen, beispielsweise
$\ f(x)\ =\ [mm] \sqrt{4-x}-\,e^{\,-\,x}$
[/mm]
(oder auch kompliziertere Terme). Um dann nicht
die Ableitung von Hand berechnen zu müssen,
würde ich (da ja ohnehin schon der Computer
eingesetzt wird) vorschlagen, anstelle des "wahren"
Ableitungswertes jeweils einen Differenzenquotienten
zu nehmen, zum Beispiel
anstatt f'(x) : $\ [mm] \frac{f(x+\varepsilon)-f(x+\varepsilon)}{2\,\varepsilon}$
[/mm]
mit einem geeigneten (genügend kleinen) [mm] \varepsilon [/mm] .
LG , Al-Chwarizmi
Noch eine kleine Übersetzungshilfe:
TI Basic MatLab
{p [1]} [mm] \to [/mm] q q = [p(1)];
For k,2,dim(p)-1 for k = 2 : length(p)-1
augment(q,{q [dim(q)]*x + p [k]}) [mm] \to [/mm] q q = [q,q(length(q))*x0+p(k)];
EndFor end
q [dim(q)]*x + p [dim(p)] [mm] \to [/mm] wert w = q(length(q))*x0+p(length(p));
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:11 Do 30.10.2014 | Autor: | Marcel |
Hi,
die deutsche Sprache ist halt *modernisiert*:
> ...
> Programmierübung, aber wenn du dies zum ersten Mal
> machst, halt schon ein bisschen aufwendig ... (sorry,
> aufwändig
> natürlich, weil es einige vielleicht die Wände rauf
> treibt ...)
http://www.duden.de/rechtschreibung/aufwendig
Beide Versionen sind okay, ich kenne *aufwendig* so aus meiner Schulzeit.
Als mein kleiner Bruder in der Schule war, und dann die Rechtschreibereform
kam (die dann wieder reformiert wurde oder wie auch immer), lernte ich das
*aufwändig* kennen, was man tatsächlich schreiben darf. Da ist zwar nix
auf der Wand, aber Deine Begründung, warum man das schreiben darf, also
warum es nun doch schreiben darf, finde ich besser, als die "weil es ja von
Aufwand kommt".
Ich warte nun noch auf die neue Reform, dass wir demnächst die ganzen
Kürzel wie *lol*, *rofl* etc. mal in die deutsche Sprache integrieren. Das
wäre doch mal ein tolles Experiment, wenn irgendein Sender derartiges
in seine Nachrichten integrieren würde.
Gruß,
Marcel
|
|
|
|