Matlab: Approximation von pi

Neue Frage »

steviehawk Auf diesen Beitrag antworten »
Matlab: Approximation von pi
Meine Frage:
Hallo Leute, ich versuche gerade ein Matlab skript zu schreiben, das folgendes machen soll:

Ich habe eine rekursive Folge programmiert, die mir die ersten n Folgenglieder einer pi approximierenden Folge anzeigt. Also z.B.

seq(10) gibt mir die ersten 10 Folgenglieder an, die sich immer mehr pi annähern..

Natürlich ist diese Approximation nicht exakt, also möchte ich den Fehler bestimmen. Der ist ja einfach
pi - z_n.

So dieses Fehler möchte ich nun graphisch darstellen, für die ersten 20 Glieder. Also mit einem plot Befehl.

Mein Problem ist jetzt, dass wenn ich so was mache, wie:

plot(2:1:20, ???)

also die X-Werte sind ja einfach meine n, und die y Werte sind ja die Differenz zwischen pi und meinem Folgenglied.

Nur wie bekomme ich immer nur das letzte Folgenglied angezeigt?? Denn meine Funktion, gibt mir ja immer alle Folgenglieder also vielleicht gleich 10 stück an, ich will aber nur jeweils das letzte haben um es mit pi zu vergleichen. Ich kann ja nicht den ganzen Vektor aus Folgenglieder mit pi vergleichen??

Hat mir jemand einen Tipp??

Meine Ideen:
Danke
Airblader Auf diesen Beitrag antworten »

Ich verstehe leider nicht genau, was du nun meinst. Du hast eine Funktion z = z(n) geschrieben, die dir einen Vektor der ersten n Folgenglieder ausgibt? Oder doch nur das n-te Folgenglied?

air
steviehawk Auf diesen Beitrag antworten »

Also ich habe eine Funktion geschrieben die n Folgenglieder iner pi approximierenden Folge darstellt, das sieht so aus:

function s = seq(n)
% gibt die ersten n Glieder der Folge wieder

z(2) = 2; %Startwert für die Rekursion
for k = 2:n % k läuft von 2 bis n durch, weil z(3) der erste Wert ist, der bestimmt werden muss
z(k+1) = 2^(k-0.5)*sqrt(1-sqrt(1-4^(1-k)*(z(k))^2)) %Rekursionsvorschrift
end

leider zeigt es mir die Null auch immer an, so dass ich im Grunde immer n+1 Glieder bekomme, könnte ich das noch verbessern?

So jetzt will ich den Fehler graphisch darstellen. D.h ich muss ja immer die Folgenglieder mit pi vergleichen. Also als x Werte des Plots die n von 2 bis 20 und Y Werte die Differnez zwischen pi und dem Folgenglied.

Aber ich kann nicht ja nicht einfach pi - seq(5) rechnen, weil ja seq(5) die ersten 5 Glieder sind + der 0 und pi nur eine Zahl.

Ich hätte also gerne, dass ich immer auf das nte Folgenglied zugreifen kann!

Etwas klarer geworden?

Vielleicht wäre es besser, wenn ich die Funktion für die Folgenglieder umschreiben würde, so dass ich sagen kann:

g = seq(5) und matlab mir dann die ersten 5 Glieder in einem Vektor g speichert, im Vektor g kann ich ja dann wieder auf die einzelnen Elemente zugreifen..

aber momentan führt g = seq(5) noch zum Error:

Error in seq (line 5)
z(2) = 2; %Startwert für die Rekursion

Output argument "s" (and maybe others) not assigned during call to
"/Users/###########/Documents/MATLAB/seq.m>seq".
Airblader Auf diesen Beitrag antworten »

Zitat:
Original von steviehawk
leider zeigt es mir die Null auch immer an, so dass ich im Grunde immer n+1 Glieder bekomme, könnte ich das noch verbessern?


Indem du die Werte im Vektor eben 'um eins nach links' verschiebst:

code:
1:
2:
3:
4:
5:
6:
function z = seq(n)

z(1) = 2;
for k = 2:n
   z(k) = 2^(k-0.5)*sqrt(1-sqrt(1-4^(1-k)*(z(k-1))^2));
end


Ich war auch mal so frei, das Semikolon in der Rekurionsvorschrift zu ergänzen (sonst gibt er das Array ständig aus), sowie die Funktion überhaupt erst zum Laufen zu bringen (wieso steht bei dir im Funktionskopf ein 's'?) Über sonstigen Sinn und Unsinn der Implementierung sprechen wir jetzt mal nicht.

Zitat:
Aber ich kann nicht ja nicht einfach pi - seq(5) rechnen, weil ja seq(5) die ersten 5 Glieder sind + der 0 und pi nur eine Zahl.


Aber letztlich willst du ja durchaus alle Folgenglieder mit Pi vergleichen, was zu der Frage führt: Hast du

code:
1:
pi - seq(5)


trotz der mathematischen Inkompatibilität schonmal probiert? Matlab ist da nämlich sehr clever! smile Nichts desto trotz auch noch die Antwort auf

Zitat:
Ich hätte also gerne, dass ich immer auf das nte Folgenglied zugreifen kann!


Das ginge (unter Verwendung der veränderten Funktion) mit

code:
1:
2:
rekursiveFolge = seq(n);
rekursiveFolge(n)


Edit: Dass es nicht läuft, hast du also doch schon selber bemerkt. Wie man es zum Laufen bringt siehst du nun ja in diesem Beitrag.

air
Airblader Auf diesen Beitrag antworten »

Nachtrag:

Matlab meckert übrigens auch bei obiger Funktion noch, allerdings nur mit einem Hinweis im Editor. Das liegt daran, dass der Vektor z innerhalb einer Schleife wächst. Das ist speichertechnisch extrem ineffizient, ein

code:
1:
z = zeros(1, n);


vor dem "z(1) = 2;" würde hier Abhilfe schaffen. Die Funktion läuft damit rund doppelt so schnell durch.

air
steviehawk Auf diesen Beitrag antworten »

Super vielen Dank für deine Mühe..

Also in der Tat kann ich pi mit meinem seq(n) durch:

pi - seq(n) vergleichen, wenn ich für n eine Zahl einsetze.. und das " ; " bewirkt ja einiges an übersicht, wusste ich auch noch nicht

Danke

wie ich allerdings die Null weg bekomme, weiß ich noch nicht, wie verschiebe ich die Glieder??
 
 
Airblader Auf diesen Beitrag antworten »

Noch ein kleiner Hinweis: Numerische Effekte sorgen dafür, dass diese Folge ab n=30 nutzlos wird. Einfach mal seq(100) anzeigen lassen.

Plotten geht übrigens ganz einfach durch plot(pi - seq(10));

air
Airblader Auf diesen Beitrag antworten »

Zitat:
Original von steviehawk
wie ich allerdings die Null weg bekomme, weiß ich noch nicht, wie verschiebe ich die Glieder??


In der korrigierten Fassung der Funktion seq, die ich gepostet habe, habe ich das bereits erledigt. Du musst z halt schon ab Index 1 befüllen, nicht erst ab Index 2.

air
steviehawk Auf diesen Beitrag antworten »

Alles klar, Danke..

Der plot sieht gut aus!

Wie kann ich den sagen, dass es den Plot nur für x von 2 - 20 anzeigen soll??

Also kann ich das Spectrum der X Werte noch eingeben?
Airblader Auf diesen Beitrag antworten »

Natürlich.

code:
1:
2:
approxFolge = seq(20);
plot(approxFolge(2:end));


air
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »