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

Hi, Bräuchte Hilfe bei einer Wertepaar-Aufgabe :)

 

MoeE
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 17.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2016, 13:44     Titel:
  Antworten mit Zitat      
Hallo,

achso alles klar, ich ändere das mal entsprechend der Beispiele und schaue erstmal was der mir dann sagt.

Danke
Private Nachricht senden Benutzer-Profile anzeigen


MoeE
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 17.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2016, 14:07     Titel:
  Antworten mit Zitat      
Code:



xdata = ...
 [1 1.5 13.8 19.8];
ydata = ...
 [300 390 124.1 67.3];

%fun = @(x,xdata)x(1)*exp(x(2)*xdata);
fun = @(xdata) x(1) + x(2) * xdata^x(3);

x0 = [100,-1];
x = lsqcurvefit(fun,x0,xdata,ydata)

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')



 


Ich habe jetzt einfach mal das Beispiel übernommen, meine Funktion eingesetzt und die x und y-werte etwas verändert. Mit der Funktion vom Beispiel funktioniert es einwandfrei. Mit meiner Funktion : f(x) = a+ b * x^c jedoch nicht.

Gruß,

Moe

Das ist die Fehlermeldung:

Error using lsqcurvefitBeispiel>@(xdata)x(1)+x(2)*xdata^x(3)
Too many input arguments.

Error in lsqcurvefit (line 202)
initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});

Error in lsqcurvefitBeispiel (line 16)
x = lsqcurvefit(fun,x0,xdata,ydata)

Caused by:
Failure in initial objective function evaluation. LSQCURVEFIT cannot continue.
Private Nachricht senden Benutzer-Profile anzeigen
 
AKNOT
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 12.10.11
Wohnort: Bochum
Version: R2018a
     Beitrag Verfasst am: 18.07.2016, 14:10     Titel:
  Antworten mit Zitat      
Du hast das x als Inputargument vergessen: @(x,xdata). Und x0 muss bei dir 3 Elemente haben, da du ja drei Parameter hast. Das sind die Startwerte, im Zweifelsfall alle 0 oder 1.
Private Nachricht senden Benutzer-Profile anzeigen
 
MoeE
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 17.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2016, 14:31     Titel:
  Antworten mit Zitat      
Code:


xdata = ...
 [1 1.5 13.8 19.8];
ydata = ...
 [300 390 124.1 67.3];

%fun = @(x,xdata)x(1)*exp(x(2)*xdata);
fun = @(x,xdata) x(1) + x(2) * xdata.^x(3);

x0 = [0,0,0];
x = lsqcurvefit(fun,x0,xdata,ydata)

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')

 


Ja, so spuckt der mir aufjedenfall was aus, sprich keine Fehlermeldung.

Für die Potenzierung (^) sagte er mir, dass ich das zu (.^) umändern sollte, also mit Punkt.

Jetzt fehlt mir denke ich nur noch die Möglichkeit die N (x,y) Wertepaare durch input selbst bestimmen zu können.

Weißt du wie ich das am besten hinbekomme ?

Gruß,

Moe
Private Nachricht senden Benutzer-Profile anzeigen
 
AKNOT
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 12.10.11
Wohnort: Bochum
Version: R2018a
     Beitrag Verfasst am: 18.07.2016, 14:39     Titel:
  Antworten mit Zitat      
Wenn du keine Vorgaben hast, wie die Nutzerinteraktion erfolgen soll, würde ich die Werte genau so vorgeben lassen. Sprich, einfach die beiden Vektoren xdata und ydata definieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
MoeE
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 17.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2016, 15:10     Titel:
  Antworten mit Zitat      
Hi,

alles klar ! Das Frage ich mal meinen Prof genauer. Ich denke nämlich das mit dem "vom Benutzer vorgegeben" gemeint ist, dass die x und y-werte wie von dir gesagt und in dem beispiel im Code schon vorgegeben sein müssen. Wenn nicht muss ich mich mal wieder hier melden ^^...

Vielen Dank für die Hilfe ... der Code funktioniert sehr gut und der spuckt mir die bestmöglichsten Parameter aus. Hab es mit vielen x, y variationen ausprobiert.

Hier wäre es genau a = 4, b= 5, c= 2 .

Code:



xdata = ...
 [1 2 3 4 5 6 7 8 9];
ydata = ...
 [9 24 49 84 129 184 249 324 409];


fun = @(x,xdata) x(1) + x(2) * xdata.^x(3);


x0 = [0,0,0];
x = lsqcurvefit(fun,x0,xdata,ydata)

plot(xdata,ydata)

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'kx',times,fun(x,times),'b-')
legend('Schnittpunkte','angepasste Exponentialkurve')

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.435
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.07.2016, 15:13     Titel:
  Antworten mit Zitat      
Hallo,

in der ursprünglichen Aufgabenstellung stand "eine Funktion", also würde ich eine Funktion
Code:
function [a,b,c] = estimateParams(xdata, ydata)

erstellen.

Der Nutzer muss die benötigten Daten dann erstellen und beim Funktionsaufruf angeben. Du kannst ja eine Abfrage einbauen, ob die Anzahl der Elemente gleich ist:
Code:
if numel(xdata) ~= numel(ydata)
error('You need to supply a matching number of x- and y-values.')
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MoeE
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 17.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2016, 16:22     Titel:
  Antworten mit Zitat      
Hallo Harald,

Code:


function [a,b,c] = estimateParams(xdata, ydata)

 


soll ich das dann einfach zu dem Code den ich schon erstellt habe hinzufügen oder muss da groß was verändert werden ?

Code:


if numel(xdata) ~= numel(ydata)
error('You need to supply a matching number of x- and y-values.')
end

 


Die Abfrage finde ich gut, ich würde diese Woche meinen Prof noch etwas genauer fragen, was damit so genau gemeint ist mit dem "Benutzer". Ob ich da gemeint bin .. Very Happy

Danke

Gruß,

Moe
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

das würde das Anlegen von xdata und ydata ersetzen.

Bei einer Funktion sollte aber auch eine kleine Dokumentation (Inputs, Outputs, Beispielaufruf) hinzugefügt werden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MoeE
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 17.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2016, 16:35     Titel:
  Antworten mit Zitat      
Hi Harald,

Code:




function [a,b,c] = estimateParams(xdata, ydata)
fun = @(x,xdata) x(1) + x(2) * xdata.^x(3);

% Startwerte der Parameter
x0 = [0,0,0];
x = lsqcurvefit(fun,x0,xdata,ydata)



plot(xdata,ydata)

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'kx',times,fun(x,times),'b-')
legend('Schnittpunkte','angepasste Exponentialkurve')
title('Schnittpunkte und angepasste Exponentialkurve')

%end


 


Der spuckt mir diese Fehlermeldung aus:

Not enough input arguments.

Error in Untitled7 (line 21)
x = lsqcurvefit(fun,x0,xdata,ydata)

Ich weiß wirklich nicht so genau wie das von dir gemeint ist bzw. wie ich das genau anwenden soll. Wäre das vielleicht machbar mir den Code bzw die Befehle etwas zurecht zurücken ... sodass das funktioniert.

Danke dir.

Moe
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.435
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.07.2016, 19:11     Titel:
  Antworten mit Zitat      
Hallo,

die Funktion sieht gut aus. Nun musst du sie aber auch passend aufrufen, z.B.
Code:
xdata = ...
 [1 2 3 4 5 6 7 8 9];
ydata = ...
 [9 24 49 84 129 184 249 324 409];
[a,b,c] = estimateParams(xdata, ydata)
 


Mehr zu Funktionen gibt es in der Doku.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MoeE
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 17.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2016, 19:24     Titel:
  Antworten mit Zitat      
Code:


xdata = ...
 [1 2 3 4 5 6 7 8 9];
ydata = ...
 [9 24 49 84 129 184 249 324 409];
[a,b,c] = estimateParams(xdata, ydata)


% Funktion vom Typ f(x) = a + b * x^c
fun = @(x,xdata) x(1) + x(2) * xdata.^x(3);


% Startwerte der Parameter
x0 = [0,0,0];


x = lsqcurvefit(fun,x0,xdata,ydata)


plot(xdata,ydata)

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'kx',times,fun(x,times),'b-')
legend('Schnittpunkte','angepasste Exponentialkurve')
title('Schnittpunkte und angepasste Exponentialkurve')


 


Fehlermeldung :

Undefined function or variable 'estimateParams'.

Error in Untitled7 (line 6)
[a,b,c] = estimateParams(xdata, ydata)

Das 'estimateParams' akzeptiert der irwie leider nicht ..

Gruß,

Moe
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wo ist denn die function-Zeile abgeblieben?

Du brauchst zwei Dateien:

1. die Funktion, gespeichert unter estimateParams.m
Code:
function [a,b,c] = estimateParams(xdata, ydata)
fun = @(x,xdata) x(1) + x(2) * xdata.^x(3);

% Startwerte der Parameter
x0 = [0,0,0];
x = lsqcurvefit(fun,x0,xdata,ydata)

plot(xdata,ydata)

times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'kx',times,fun(x,times),'b-')
legend('Schnittpunkte','angepasste Exponentialkurve')
title('Schnittpunkte und angepasste Exponentialkurve')

%end


2. in einer getrennten Datei das Skript, das diese Funktion aufruft:
Code:
xdata = ...
 [1 2 3 4 5 6 7 8 9];
ydata = ...
 [9 24 49 84 129 184 249 324 409];
[a,b,c] = estimateParams(xdata, ydata)


Für weiteres Arbeiten mit MATLAB kann ich nur empfehlen, in der Doku über Funktionen nachzulesen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MoeE
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 17.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2016, 22:41     Titel:
  Antworten mit Zitat      
Hallo Harald,

dies ist eine Abgabeübung, bei der ich nur eine Datei im .m Format abgeben sollte.

Dein Vorschlag mit den zwei Dateien und der Speicherung der Funktion hört sich sehr gut an aber kann ich nicht ganz nachvollziehen bzw. versteh ich nicht.

Danke.

Gruß,

Moe
Private Nachricht senden Benutzer-Profile anzeigen
 
AKNOT
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 12.10.11
Wohnort: Bochum
Version: R2018a
     Beitrag Verfasst am: 19.07.2016, 06:45     Titel:
  Antworten mit Zitat      
Du könntest das, was in der zweiten Datei (Skript) steht, auch einfach in das Command Window tippen. Dann hast du nur eine Datei.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3  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.