WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Interpolation

 

MarcelF6
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2012, 23:10     Titel: Interpolation
  Antworten mit Zitat      
Hallo miteinander.

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
   
end
   
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? Razz ]

Danke für die Tipps.
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.02.2012, 07:32     Titel:
  Antworten mit Zitat      
Hallo,

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.

Beispiel:
Code:

f = @(x) 1./(1+x.^2);
plot(x,f(x));
 


Eine legende kannst du mit dem Befehl legend erzeugen.
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.02.2012, 14:58     Titel:
  Antworten mit Zitat      
Danke für den schnellen Beitrag. Werde es gleich nochmals versuchen.
Sorry, der Grad des Polynoms sollte jeweils gleich n sein.

Ich habe nun das hier:
Code:

function Test(d)
[x] = -d : 0.1 : d;
f = @(x) 1./(1+x.^2);
i = 0;
n=2;

while i <= n
    x(i) = -d + ((2*d)./n)*i;
    i = i+1;
end

p_d_n = sum(x(0:n)*x.^(0:n));

plot(x, f(x), x, p_d_n);
legend('f(x)', 'p_{5,2}');

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.02.2012, 16:07     Titel:
  Antworten mit Zitat      
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
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 29.02.2012, 16:43     Titel:
  Antworten mit Zitat      
MarcelF6 hat Folgendes geschrieben:

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2012, 00:03     Titel:
  Antworten mit Zitat      
Ok. Aber das ist ja der Wert des Stützpunkts, und der ist halt nun einfach negativ. Wie kann man das sonst implementieren?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 01.03.2012, 01:33     Titel:
  Antworten mit Zitat      
Hallo MarcelF6,

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:
Code:
x = -1;
y = 3;

Man benötigt also zwei Vektoren, einen für die X-Werte, den zweiten für die Y-Werte.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2012, 11:28     Titel:
  Antworten mit Zitat      
Ah danke für den Hinweis.
Ich habs nun so abgeändert:
Code:

function Test(d,n)
%[x] = -d : 0.1 : d;
%[y] = 0 : 0.1 : 1;

f = @(x) 1./(1+x.^2);

for i = 0:2:n
    x(i+1) = -d + ((2*d)./n)*i;
    y(i+1) = 1./(1+x(i+1).^2);
end

p=polyfit(x,y,n);
plot(x, f(x), x, p)
axis([-d d 0 1])

% plot(x, f(x), x, p_d_n);
% legend('f(x)', 'p_{5,2}');

end
 


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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2012, 14:34     Titel:
  Antworten mit Zitat      
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:

Code:

x = linspace(-d,d,n);
y = f(x);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2012, 19:20     Titel:
  Antworten mit Zitat      
Ok, danke für den Tipp.
Ich habs nun so:
Code:

function Stuetz(d,n)
%[x] = -d : 0.1 : d;
%[y] = 0 : 0.1 : 1;
f = @(x) 1./(1+x.^2);
x = linspace(-d,d,n);
y = f(x);

for i = 0:1:n
    x(i+1) = -d + ((2*d)./n)*i;
    y(i+1) = 1./(1+x(i+1).^2);
end

p=polyfit(x,y,n);
g=polyval(p,x);
plot(x, g)
%axis([-d d 0 1])

% plot(x, f(x), x, p_d_n);
% legend('f(x)', 'p_{5,2}');

end
 


Allerdings stimmt (so glaube ich) immer noch nicht alles, denn die Kurve ist immer noch kein Polynom zweiten Grades :/ ..was ist noch wie zu ändern?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2012, 06:39     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2012, 09:08     Titel:
  Antworten mit Zitat      
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 Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2012, 10:05     Titel:
  Antworten mit Zitat      
die Berechnung des Polynoms ist richtig, aber die Darstellung im plot ist wenig aussagekräftig. Besser wäre es sich mehr Punkte anzeigen zu lassen.


Code:

d = 5;
n = 2;

f = @(x) 1./(1+x.^2);
x = linspace(-d,d,n+1);
y = f(x);

xv = linspace(-d,d,1000).';

p=polyfit(x,y,n);
g=polyval(p,xv);

figure('name','Vergleich funktion-approximation durch Polynom');
plot(xv,[f(xv),g]);hold on;
legend('f(x)', 'polynom');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
MarcelF6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2012, 11:35     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2012, 12:36     Titel:
  Antworten mit Zitat      
mit dem Befehl

Code:


kannst du mehrere Funktionen in ein figure zeichnen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.