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

Komplexes Anpassungsproblem mit lsqcurvefit

 

Mac-Cherony
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 13.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.03.2014, 21:35     Titel: Komplexes Anpassungsproblem mit lsqcurvefit
  Antworten mit Zitat      
Hallo allerseits,

ich habe ein Problem die folgende Funktion mittels lsqcurfefit anzupassen:
Code:
function [V]=myfunction(x0, eta, w, H, xdata)

V=zeros(1, length(xdata));

for n=1:length(x0)

v=H(n)*(eta(n)*(1./(1+((xdata-x0(n))./w(n)).^2))+(1-eta(n))*exp(-log(2)*((xdata-x0(n))./w(n)).^2));

V=V+v;

end


Da ich zunächst davon ausgegangen bin, dass mein Problem in der Struktur der verwendeten Funktion liegt habe ich analog zur Hilfe und den Fall, dass ich 2 Signale anpassen möchte ein function handle konstruiert:
Code:
xdata=[0:0.5:100];
x0=[30 50];
eta=[1 0.5];
w=[5 5];
H=[100 100];

ydata=myfunction(x0, eta, w, H, xdata);

x=[x0 eta w H];

f=@(x,xdata) x(7)*(x(3)*(1./(1+((xdata-x(1))./x(5)).^2))+(1-x(3))*exp(-log(2)*((xdata-x(1))./x(5)).^2))+x(8)*(x(4)*(1./(1+((xdata-x(2))./x(6)).^2))+(1-x(4))*exp(-log(2)*((xdata-x(2))./x(6)).^2))

x = lsqcurvefit(f,x0,xdata,ydata);


Trotzdem lässt sich diese Funktion nicht anpassen! Allerdings stehe ich auch noch vor weiteren Herausforderungen bei der Anpassung. So soll beispielsweise eta nur Werte zwischen 0 und 1 annehmen und die entsprechenden Werte für x0 sollen nur in einem kleinen Bereich (z.B. +/-2 in diesem Beispiel) variiert werden.

Kann mir bei diesem komplexen Problem Jemand weiterhelfen?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

Zitat:
Trotzdem lässt sich diese Funktion nicht anpassen!

Was passiert denn, wenn du's wie von dir beschrieben versuchst?

Zitat:
So soll beispielsweise eta nur Werte zwischen 0 und 1 annehmen und die entsprechenden Werte für x0 sollen nur in einem kleinen Bereich (z.B. +/-2 in diesem Beispiel) variiert werden.

Das kannst du doch in lb und ub als zusätzliche Eingabeargumente angeben.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 13.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.03.2014, 22:19     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke schonmal für deine Mühe! Ich bekomme die folgende Fehlermeldung:

Zitat:
Attempted to access x(7); index out of bounds because numel(x)=2.

Error in
@(x,xdata)x(7)*(x(3)*(1./(1+((xdata-x(1))./x(5)).^2))+(1-x(3))*exp(-log(2)*((xdata-x(1))./x(5)).^2))+x(8)*(x(4)*(1./(1+((xdata-x(2))./x(6)).^2))+(1-x(4))*exp(-log(2)*((xdata-x(2))./x(6)).^2))


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

Error in Test (line 13)
x = lsqcurvefit(f,x0,xdata,ydata);

Caused by:
Failure in initial user-supplied objective function evaluation.
LSQCURVEFIT cannot continue.


wenn ich allerdings auf der Konsole
Code:
eingebe, gibt er wie ich es erwarte 8 aus und auf x(7) kann ich zudem auch zugreifen.

Das mit den upper und lower boundaries hab ich in der Hilfe nicht so ganz verstanden. Muss ich das auch als Vektor eingeben und somit für jede Anpassungsvariable diese Grenzen festlegen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn du in der Funktion x0, H, eta und w optimieren möchtest, dann musst du auch Startwerte für alle 8 an lsqcurvefit übergeben, also wohl x statt x0.

Zitat:
Muss ich das auch als Vektor eingeben und somit für jede Anpassungsvariable diese Grenzen festlegen?

Ja. Wenn für einzelne Variablen keine Grenzen vorgegeben werden sollen, kann man für diese -inf als untere Grenze bzw. inf als obere Grenze angeben.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 13.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2014, 01:50     Titel:
  Antworten mit Zitat      
Vielen Dank Harald! Das habe ich leider total übersehen...so funktioniert es dann auch (natürlich)...
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2025 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.