Matlab: Approximation von pi |
21.04.2012, 15:30 | steviehawk | Auf diesen Beitrag antworten » | |||||||||||||||||||||
Matlab: Approximation von pi 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 |
|||||||||||||||||||||||
21.04.2012, 15:33 | 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 |
|||||||||||||||||||||||
21.04.2012, 15:47 | 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". |
|||||||||||||||||||||||
21.04.2012, 15:57 | Airblader | Auf diesen Beitrag antworten » | |||||||||||||||||||||
Indem du die Werte im Vektor eben 'um eins nach links' verschiebst:
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.
Aber letztlich willst du ja durchaus alle Folgenglieder mit Pi vergleichen, was zu der Frage führt: Hast du
trotz der mathematischen Inkompatibilität schonmal probiert? Matlab ist da nämlich sehr clever! Nichts desto trotz auch noch die Antwort auf
Das ginge (unter Verwendung der veränderten Funktion) mit
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 |
|||||||||||||||||||||||
21.04.2012, 16:01 | 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
vor dem "z(1) = 2;" würde hier Abhilfe schaffen. Die Funktion läuft damit rund doppelt so schnell durch. air |
|||||||||||||||||||||||
21.04.2012, 16:10 | 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?? |
|||||||||||||||||||||||
Anzeige | |||||||||||||||||||||||
|
|||||||||||||||||||||||
21.04.2012, 16:12 | 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 |
|||||||||||||||||||||||
21.04.2012, 16:13 | Airblader | Auf diesen Beitrag antworten » | |||||||||||||||||||||
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 |
|||||||||||||||||||||||
21.04.2012, 16:25 | 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? |
|||||||||||||||||||||||
21.04.2012, 16:26 | Airblader | Auf diesen Beitrag antworten » | |||||||||||||||||||||
Natürlich.
air |
|
Verwandte Themen
Die Beliebtesten » |
Die Größten » |
|
Die Neuesten » |