Ich möchte gerne folgendes machen:
Eine Funktion f: [-d,d] -> R ist gegeben durch f(x) = 1/(1+x^2).
Das Interpolationspolynom p_(d,n) ist gegeben durch p_(d,n) (x_i) = f(x_i) für die Stützstellen x_i = -d + 2d/(n)*i , wobei 0 <= i <= n.
Nun möchte ich erstmal die Funktionen f und p_(d,n) graphisch darstellen für d=5 und n=2,4,6,8,10.
Ich hab das mal versucht, allerdings funktioniert es leider noch nicht richtig. Zudem denke ich, dass man es einfacher bewerkstelligen könnte..
Code:
function Test(d) [x] = -d : 0.1 : d;
f = 1./(1+x.^2);
i = 0;
plot([x],f);
for n = 2 : 2 : 10 while i <= n
x_i = -d + (2.*d)/(n).*i;
i = i + 1;
plot([x],f(x_i));
end
Was müsste wie geändert werden? Und wie lautet der Befehl, um eine Legende zu erstellen?
[Ich hab mal noch was von polyfit() gelesen..aber das wäre ja fast schon Betrug, nicht? ]
ich würde es erstmal mit einem festen d und n anfangen (for schleife weglassen). Eine Schleife ist dann schnell darum gebastelt.
Ich vermisse auch die Angabe welchen Grad das Interpolationspolynom (welches im Quelltext nirgends auftaucht) besitzen soll.
Außerdem sind in dem Quelltext noch ein paar Fehler.
Innerhalb der Schleife verwendest du f als wäre es eine Funktion. Es ist aber ein Vektor. An dieser Stelle ist es nützlich mit function handles zu arbeiten.
Allerdings verstehe ich nicht genau, warum der Fehler "Attempted to access x(0); index must be a positive integer or
logical." erscheint. Das müsste doch eigentlich zulässig sein, oder wo liegt da der Fehler?
Ich muss dann noch den Fehler
E_(d,n) := max | (f-p_(d,n))*(-d + ((2d)/n)*i) | in Abhängigkeit von n in einer Tabelle darstellen. Wäre hierbei folgender Code korrekt?
(nach dem obigen Code in derselben Function angefügt)
Code:
I = 2 : 1 : 10;
for n = 2 : 2 : 10 for i = 0 : 1: 1000
e_d_n = max(abs(f(x) - p_d_n)*(-d+((2*d)./1000)*i);
end
t = [I; p_d_n];
end
Allerdings verstehe ich nicht genau, warum der Fehler "Attempted to access x(0); index must be a positive integer or
logical." erscheint. Das müsste doch eigentlich zulässig sein, oder wo liegt da der Fehler?
die elemetadressierung fängt immer bei 1 an. es giebt kein 0. element.
Man darf nicht den Index eines Vektors mit dem Inhalt verwechseln.
Um auszudrücken, welchen Wert ein Vector bei z.B. -1 hat, kann man also nicht x(-1)=3 setzen, sondern:
Eigentlich funktioniert der Code, nur bin ich nicht sicher, ob das Ergebnis stimmt. (d.h. ich bin ziemlich sicher, dass irgendwas noch nicht stimmt)
Der Grund: Mein f(x) ist z.B. keine schöne Kurve, sondern besteht aus zwei "Geraden". Zudem kann der Plot meiner Interpolationspolynome auch nicht stimmen, denn für n=10 kommt zb gar keine Kurve mehr raus, sondern nur noch "Striche".
Was ist falsch an dem Code?
Dein Stützstellenvektor x wird nicht richtig berechnet. Innerhalb der Schleife berechnest du nur jeden zweiten Wert.
Außerdem musst du die Funktion polyval verwenden um die Werte des Polynoms p zu berechnen.
Außerdem würde dir vielleicht der Befehl linspace helfen:
1. du überschreibst x und y in der for schleife. Der linspace Befehl war als Alternative zu der for schleife gedacht. In deinem code sind die beiden Zeilen vor der schleife somit überflüssig.
2. Das Polynom wird schon richtig berechnest. Allerdings zeichnest du nur n+1 Punkte ein. Daher kann den Verlauf des Polynoms nicht gut erkennen.
Hey danke für den Beitrag.
@1: ok, alles klar. Hab die Beschreibung zu linspace gelesen und noch gedacht, warum ich das nochmals machen müsse :p
@2: ok, dh es ist eigentlich alles iO, oder? Weil das mit der Anzahl Stützstellen ja gerade der Witz ist: 0 <= i<= n
Yeah danke! Sieht wahrlich viel besser aus. Noch eine Frage: gibt es eine Alternative zur for-Schleife, durch die ich für die n von 2 bis 10 immer einen neuen Plot zeichne? (also kann man das irgendwie gescheiter implementieren, sodass ich nur ein Fenster brauche, wo aber alle Funktionen für alle n geplottet werden?
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.