Iterationsverfahren < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 10:08 Fr 16.05.2014 | Autor: | David90 |
Aufgabe | Gegeben ist das Iterationsverfahren: [mm] x_{k+1}=\bruch{1}{2}*(x_k+\bruch{a}{x_k})-\bruch{(x_{k}^2-a)}{8*x_{k}^3}.
[/mm]
a) Wie viele Iterationen braucht man um mit diesem Verfahren die Zahl [mm] \wurzel{5} [/mm] auf 15 Dezimalstellen genau zu bestimmen, wenn man mit dem Wert [mm] x_0=5 [/mm] startet?
b) Wie viele Iterationen benötgt man für dieselbe Aufgabe, wenn man das Newton-Verfahren benutzt? Zur Erinnerung: Das Newton-Verfahren ist: [mm] x_{k+1}=\bruch{1}{2}*(x_k+\bruch{a}{x_k}). [/mm] |
Hallo Leute.
ich wüsste gerne wie man die Aufgabe mit Matlab löst.
Also man muss das doch mit einer Schleife machen:
for k=1:iterationsschritte
...
end
Aber iterationsschritte ist doch genau die Variable die wir suchen. Ist es vielleicht besser mit einer while-Schleife zu arbeiten, in der man vorher immer überprüft, ob x_(k+1) [mm] =\wurzel{5} [/mm] ist?
Danke schon mal im Voraus.
Viele Grüße
|
|
|
|
hallo, so, wie du das dachtest mit der "while-schleife", funktioniert das nicht.
Wenn du angibst x_(k+x) = [mm] \wurzel{5} [/mm] läuft die Schleife ewig durch.
Wenn überhaupt müsstest du dir noch einen Rekursionsanker einbauen, der nach 15 Durchläufen einsetzt.
Gruß
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:05 Fr 16.05.2014 | Autor: | David90 |
Ok also eher mit einer for-Schleife. Ich habe folgendes programmiert.
max=100;
x=5;
for k=1:max
[mm] x_k=0.5*(x+a/x)-((x^2-a)^2)/(8*x^3);
[/mm]
if [mm] x_k==sqrt(5)
[/mm]
disp(['Für die Berechnung der Wurzel aus 5 benötigt man' num2str(k) 'Iterationsschritte']);
break
end
[mm] x_k=x;
[/mm]
end
Kann man das so machen? Das Problem ist, dass ich nicht weiß, was ich für a deklarieren soll. Es ist nur vorgegeben a>0. Außerdem fehlt mir noch bei der if-Anweisung, dass sqrt(5) auf 15 Dezimalstellen bestimmt werden soll.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 20:02 Fr 16.05.2014 | Autor: | weduwe |
[mm]f(x)= x^2-a\to f(x)=x^2-5[/mm]
wie groß ist also a?
dein "programm" würde ich noch einmal überdenken, insbesondere auch den index "k"
ich hätt´s auch mit einer while - schleife gemacht
möglicherweise kommt so etwas heraus:
[Dateianhang nicht öffentlich]
Dateianhänge: Anhang Nr. 1 (Typ: JPG) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:08 Fr 16.05.2014 | Autor: | David90 |
MMhhh du hast Recht, wenn ich a=5 deklariere und die Schleife durchlaufen lasse, ändert sich xk nixht. Was stimmt denn mit dem Indey k nicht?
Viele Grüße
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:22 Fr 16.05.2014 | Autor: | weduwe |
es ist in diesem zusammenhang ganz egal, welchen wert du a zuweist.
du änderst ja den wert von x NIE, also auch den von [mm] x_k [/mm] nicht.
richtig wäre x = ...... (mit a = 5)
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 01:04 Sa 17.05.2014 | Autor: | David90 |
Ah na klar, das sieht schon gut aus. Jetzt fehlt nur noch bei der if-Bedingung, dass die Wurzel auf 15 Dezimalstellen genau berechnet werden soll. Hat jemand da den Befehl zur Hand?
Viele Grüße
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 02:33 Sa 17.05.2014 | Autor: | weduwe |
mach halt irgendsoetwas:
[mm] w=\sqrt{15} [/mm] oder du definierst halt ein x_alt
[mm] \epsilon=10^{-15}
[/mm]
if [mm] |w-x|<\epsilon [/mm] .... if [mm] ||x|-|x_{alt}||<\epsilon [/mm] ...
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:13 So 18.05.2014 | Autor: | David90 |
Ok also der fertige Code sieht jetzt so aus:
close all
clear all
clc
max=100;
x=5;
a=5;
%vorgegebenes Verfahren
for k=1:max
[mm] x=0.5*(x+a/x)-((x^2-a)^2)/(8*x^3);
[/mm]
if x==abs(10^(-15)-sqrt(5))
disp(['Für die Berechnung der Wurzel aus 5 benötigt man mit dem vorgegebenen Verfahren' num2str(k) ' Iterationsschritte']);
break
end
end
Allerdings scheint der disp-Befehl nicht zu funktionieren, da nicht angezeigt wird, wie viele Iterationen benötigt wurde.
Und ich habe eine weitere Frage: Wenn man die Iterationen jetzt mit dem Newton-Verfahren berechnen möchte, muss man sich doch vorher eine Funktion f deklarieren, weil das Newton-Verfahren ja so definiert ist:
[mm] x_{k+1}=x_k-\bruch{f(x_k)}{f'(x_k)}
[/mm]
Wenn ich jetzt sage [mm] f=x^2 [/mm] -a, wie definiere ich denn x? Das ist ja eigentlich das was ich rausbekommen möchte. Kommt die Funktion in die Schleife?
Viele Grüße
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:24 So 18.05.2014 | Autor: | weduwe |
zu dem "disp"- befehl kann ich nix sagen.
ansonsten statt vieler worte den VBA-Code
(Newton hast du doch eh oben definiert)
Dateianhänge: Anhang Nr. 1 (Typ: JPG) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 14:30 So 18.05.2014 | Autor: | David90 |
Sorry ich versteh deine Antwort nicht xD
Viele Grüße
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:53 So 18.05.2014 | Autor: | weduwe |
WAS verstehst du denn da nicht?
im anhang ist eine mögliche Umsetzung in Excel-VBA
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:19 So 18.05.2014 | Autor: | David90 |
Achso hatte nicht gesehen, dass du was angehängt hast. Aber aus dem Code werd ich nicht schlau. Ich hätte das jetzt so gemacht, aber da kommt Matalb nich auf [mm] \wurzel{5}.
[/mm]
%Newton-Verfahren
for k=1:max
[mm] x=x+(x^2-a)/2*x
[/mm]
if x==abs(10^(-15)-sqrt(5))
disp(['Für die Berechnung der Wurzel aus 5 benötigt man mit dem Newton-Verfahren' num2str(k) ' Iterationsschritte']);
break
end
end
Viele Grüße
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 09:06 Mo 19.05.2014 | Autor: | weduwe |
wie sollte da auch das richtige herauskommen, das ist doch Unsinn!
setz statt des PLUS ein MINUS, dann stimmt´s und stimmt vor allem mit der Formel im 1. Beitrag überein (und mit meinem Code) , von der du dir vielleicht klar machen solltest, warum sie stimmt, also
[mm]x=x-\frac{x^2-a}{2x}=\frac{1}{2}(x+\frac{a}{x})[/mm]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 13:50 Mo 19.05.2014 | Autor: | David90 |
Oh na klar, war einfach ein Tippfehler. Ok die Verfahren stimmen jetzt.
Weißt du was mit dem disp-Befehl nicht stimmen könnte? Das macht man doch mit num2str(k) oder? Dachte vielleicht dass die if-Anweisung einfach nicht erreicht wird, aber an kommt auf jeden Fall auf [mm] \wurzel{5} [/mm] sonst würde das Verfahren ja ewig weiterlaufen.
Viele Grüße
|
|
|
|
|
Der disp-Befehl passt schon. Wenn er dir nicht angezeigt wird, dann wird die Bedingung nicht erfüllt. Du berechnest ja trotzdem deine Wurzel mit Hilfe des Newton-Verfahrens, wahrscheinlich läuft das komplett bis zum letzten Iterationsschritt durch.
Der Fehler ist, dass du auf Gleichheit prüfst. Du willst aber wissen, wann die Abweichung KLEINER als [mm]10^{-15}[/mm] ist. Wenn du das anpasst, hast du die gewünschte Lösung.
Allerdings sieht das Newton-Verfahren bei deiner letzten Antwort anders aus, als im Urspungspost. Da solltest du nochmal ein auge drauf werfen.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:23 Mo 19.05.2014 | Autor: | weduwe |
>
> Allerdings sieht das Newton-Verfahren bei deiner letzten
> Antwort anders aus, als im Urspungspost. Da solltest du
> nochmal ein auge drauf werfen.
ausmultiplizieren öffnet unter Berücksichtigung meiner letzten Mitteilung die augen
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:38 Mo 19.05.2014 | Autor: | sijuherm |
d'accord!
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:27 Mo 19.05.2014 | Autor: | David90 |
Mmmhhh wenn ich jetzt sage x soll kleiner sein, gibt er mir auch nichts aus. Komisch ist das. Er läuft einfach alle 100 Schritte durch und x ist nie kleiner als [mm] \wurzel{5}. [/mm] Hier ist nochmal der Code beider Verfahren:
close all
clear all
clc
max=100000;
x=5;
a=5;
%vorgegebenes Verfahren
for k=1:max
[mm] x=0.5*(x+a/x)-((x^2-a)^2)/(8*x^3);
[/mm]
if x<abs(10^(-15)-sqrt(5))
disp(['Für die Berechnung der Wurzel aus 5 benötigt man mit dem vorgegebenen Verfahren' num2str(k) ' Iterationsschritte']);
break
end
end
x=5;
a=5;
%Newton-Verfahren
for k=1:max
x=0.5*(x+a/x);
if x<abs(10^(-15)-sqrt(5))
disp(['Für die Berechnung der Wurzel aus 5 benötigt man mit dem Newton-Verfahren' num2str(k) ' Iterationsschritte']);
break
end
end
Viele Grüße
|
|
|
|
|
Manchmal sieht man den Wald vor lauter Bäumen nicht. Aber wenn man es sieht, dann ist es glasklar, warum es nicht funktioniert.Deine Überprüfung/Abbruchbedingung ist falsch. Und sie verändert sich auch nicht über die einzelnen Loops. richtig wäre hier:
1: | eps = abs(x-sqrt(a));
| 2: | if eps<1e-15 % 1e-15 ist das gleiche wie 10^(-15)
| 3: | disp(['Für die Berechnung der Wurzel aus 5 benötigt man mit dem Newton-Verfahren ' num2str(k) ' Iterationsschritte']);
| 4: | break
| 5: | end |
Damit sollte jetzt auch der gewünschte Text angezeigt werden. Gibt noch weitere Kleinigkeiten, die das Programm verbessern könnten, z.B. die Berechnung anderer Wurzeln zu ermöglichen, ohne an 6(!) Stellen die Zahl ändern zu müssen. Aber zumindest für die 5 tuts jetzt was es soll.
|
|
|
|