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

Lineare Interpolation

 

MarcelF6
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 18.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.03.2012, 20:26     Titel: Lineare Interpolation
  Antworten mit Zitat      
Guten Abend miteinander

Ich mache die (stückweise) lineare Interpolation und möchte dann gerne den maximalen Fehler im Vergleich zur Originalfunktion messen.
Allerdings gibt es dort einen Fehler (siehe "Fehler").
Meine Idee ist, dass man den Abstand nur bei den Stützstellen messen muss, da dort der Abstand jeweils am grössten sein müsste (oder?).
Da ich zum Einen nicht sicher bin, ob diese Vermutung korrekt ist und zum Anderen auch nicht auf einen funktionierenden Code kam, stelle ich die Frage hier.

Code:

function Test(d)
% n = Anzahl Stützstellen
% f = Funktion

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

while n <= 10
% Stützstellen
for i = 0:1:n
    x(i+1) = -d+((2*d)./n)*i;
    y(i+1) = 1./(1+x(i+1).^2);
end
% Stützwerte
%y=f(x);                  
 
% M = Steigung der jeweiligen Kurvenabschnitte
M=zeros(n,1);
% B = geeignete Konstanten
B=zeros(n,1);


% lineare Interpolation normale Geraden  
for i=1:n                      
     m=(y(i+1)-y(i))/(x(i+1)-x(i));
     b=y(i)+m*-x(i);
     
     M(i,1)=m;
     B(i,1)=b;
end

M
B

figure('Name','Stückweise lineare Interpolation'); hold on;
plot(x,y,'-rs'); hold on;
grid on;
title('Aufgabe 2');

for i = 0:1:1000
        x(i+1) = -d+2*d*i/1000;
        max_error=max(abs(f(x)-y)); %Fehler.
end
max_error

n = n+2;
end
 


MfG, Marcel
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.03.2012, 22:17     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Meine Idee ist, dass man den Abstand nur bei den Stützstellen messen muss, da dort der Abstand jeweils am grössten sein müsste

Im Gegenteil, an den Stützstellen ist der Fehler 0. Den maximalen Fehler zu bestimmen ist schwierig, da man dazu gewisse Annahmen über die Kurve treffen muss. Ansonsten könnte es ja sein, dass der Kurve irgendwo zwischendrin "abhaut".
In deinem Fall ist die Funktion als Formel gegeben, du könntest also das Maximum finden, indem du die Ableitung 0 setzt.

Grüße,
Harald
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: 10.03.2012, 22:57     Titel:
  Antworten mit Zitat      
Ok, du hast Recht.
Die Ableitung ist 0 genau dann wenn x=0 ist.
Heisst das, dass dort der maximale Fehler liegt?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.03.2012, 23:08     Titel:
  Antworten mit Zitat      
Hallo,

du solltest nicht die Ableitung der Funktion nehmen, sondern des Fehlerfunktional. Das muss auf jeden Interpolationsintervall gemacht werden. Dann bekommst du den maximalen Fehler auf jeden Interpolationsintervall, und damit auch den maximalen Fehler insgesamt.

Grüße,
Harald
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: 10.03.2012, 23:29     Titel:
  Antworten mit Zitat      
oke..ist also eher etwas, das man von Hand machen sollte, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.03.2012, 09:54     Titel:
  Antworten mit Zitat      
Hallo,

nicht unbedingt; die Symbolic Math Toolbox kann da auch helfen.

Der Vorschlag etwas detaillierter:
- Ableitung von f berechnen
- Ableitung des Fehlers ist f' - m(i)
- Diesen Ausdruck 0 setzen
- Nach x auflösen (spätestens das kannst du wieder mit MATLAB machen). Die Lösung zwischen x(i) und x(i+1) ist die Stelle mit dem (betragsmäßig) größten Fehler. Falls es in einem Intervall mehrere solcher Stellen geben sollte, such dir die mit dem größten Fehler.
- Bilde das Maximum über alle Intervalle.

Grüße,
Harald
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: 11.03.2012, 14:33     Titel:
  Antworten mit Zitat      
Hallo,

also bis zum Punkt "Ausdruck 0 setzen" ist alles ok, siehe:¨

Code:

for i = 0:1:1000
        %Ableitung des Fehlers:
        AblFehler = df-m(i);
        % AblFehler 0 setzen und GLS lösen.
end
 


Wie aber kann ich das GLS 0 setzen und dann nach x auflösen lassen? Ich habs mal mit fsolve versucht, allerdings war dies immer fehlerhaft.
Zum letzten Punkt: Dies lässt sich wieder mit max() erreichen, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.03.2012, 14:57     Titel:
  Antworten mit Zitat      
Hallo,

was ist df bei dir?

Inwiefern war die Lösung mit fsolve fehlerhaft?

Poste bitte den relevanten Code.

Grüße,
Harald
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: 11.03.2012, 15:10     Titel:
  Antworten mit Zitat      
df ist einfach die Ableitung von f (von "Hand" definiert).
Ich habe:
Code:

for i = 1:1:1000
        %Ableitung des Fehlers:
        x(i+1) = -d+2*d*i/1000;
        AblFehler = df-m(i);
        error=fsolve(AblFehler, x);
        max_error=max(abs(error));
end
 


Aber erhalte momentan die Fehlermeldung:
Zitat:
Undefined function 'minus' for input arguments of type 'function_handle'.

Error in LinInterpol2 (line 44)
AblFehler = df-m(i);
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.03.2012, 16:37     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
df ist einfach die Ableitung von f (von "Hand" definiert).

Auch dazu gibts mehrere Möglichkeiten. Bitte poste doch bei sowas den Code anstatt zu versuchen, das zu beschreiben.

Anscheinend hast du df als Function Handle definiert. Dann würde ich es so machen:
Code:
AblFehler = @(x) df(x)-m(i);


In der nächsten Zeile solltest du einen Wert im Interval [x(i), x(i+1)] als Startwert nehmen, z.B. den Mittelpunkt des Intervalls.

Grüße,
Harald
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: 11.03.2012, 17:01     Titel:
  Antworten mit Zitat      
Ok, ich habe nun sowas hier:

Code:
for i = 1:1:1000
        %Ableitung des Fehlers:
        x(i+1) = -d+2*d*i/1000;
        AblFehler = @(x) df(x)-m(i);
        error= @(x) fsolve(AblFehler, d/2);
        max_error=max(abs(error));
end


aber: ich bekomm nun (unerwartet) den Fehler:
Zitat:
Error using plot
Vectors must be the same lengths.

Error in LinInterpol2 (line 37)
plot(x,y,'-rs'); hold on;


Was tun? Ich denke, dass der max_error nicht korrekt ist - aber das Problem muss woanders liegen, denn auch ohne den max_error erscheint derselbe Fehler.

Der Code lautet soweit:
Code:
function Test(d)


n = 2;
f = @(x) 1./(1+x.^2);
df = @(x) -2*x./(x^2+1)^2;

while n <= 10

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

%y=f(x);                  
 

M=zeros(n,1);

B=zeros(n,1);


 
for i=1:n                      
     m=(y(i+1)-y(i))/(x(i+1)-x(i));
     b=y(i)+m*-x(i);
     
     M(i,1)=m;
     B(i,1)=b;
end

M
B


plot(x,y,'-rs'); hold on;
grid on;


for i = 1:1:1000
        %Ableitung des Fehlers:
        x(i+1) = -d+2*d*i/1000;
        AblFehler = @(x) df(x)-m(i);
        error= @(x) fsolve(AblFehler, d/2);
        max_error=max(abs(error));
end
max_error

n = n+2;
end


Zuletzt bearbeitet von MarcelF6 am 11.03.2012, 17:50, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.03.2012, 17:27     Titel:
  Antworten mit Zitat      
Hallo,

nutze doch für sowas den Debugger.

Das Problem wird sein, dass du in der letzten for-Schleife x nochmal neu- bzw. überschreibst.

Zudem ist die Sache mit dem maximalen Fehler so nicht sinnvoll.

Du könntest z.B. in der Schleife mit error(i) arbeiten, und nach der Schleife das Maximum über den Vektor error berechnen. Im übrigen würde ich die Variable anders benennen, da es auch eine Funktion error gibt.

Grüße,
Harald
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: 11.03.2012, 18:18     Titel:
  Antworten mit Zitat      
Leider scheint es nicht so einfach zu funktionieren:
Zitat:
Nonscalar arrays of function handles are not allowed; use cell arrays instead
Error in LinInterpol2 (line 45)
fehler(i)= @(x) fsolve(AblFehler, d/2);


Code:
for i = 1:1:1000
        %Ableitung des Fehlers:
        %x(i+1) = -d+2*d*i/1000;
        AblFehler = @(x) df(x)-m(i);
        fehler(i)= @(x) fsolve(AblFehler, d/2);
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: 11.03.2012, 19:20     Titel:
  Antworten mit Zitat      
Übrigens: wie würde man das implementieren, wenn man den Aufwand (also die Anzahl Stützstellen) messen will, um in der Maximumsnorm eine gewisse Genauigkeit zu erreichen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.03.2012, 21:25     Titel:
  Antworten mit Zitat      
Hallo,

schau dir bitte mal die Doku zu fsolve an. Die Verwendung von Function Handles ist in der Form unsinnig. Stattdessen
Code:
fehlerx(i)= fsolve(AblFehler, startwert);

Der Startwert sollte von i abhängen. Achtung: du bekommst den x-Wert, an dem der max. Fehler vorliegt, du musst also noch den Fehler an dieser Stelle auswerten.

Zu der weiteren Frage: verschiedene Anzahlen von Stützstellen durchtesten und sehen, was ausreichend ist.

Ich würde im übrigen eine systematische Einarbeitung in MATLAB empfehlen, anstatt sich hier von Problem zu Problem zu hangeln...


Grüße,
Harald
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.