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

Nichtlinearer bzw. exponentieller Fit

 

Markus_Gark
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 19.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2012, 19:51     Titel: Nichtlinearer bzw. exponentieller Fit
  Antworten mit Zitat      
Hallo zusammen,

ich brauche Hilfe beim Fitten einer Kurve. Ich habe einen Kraftverlauf in Form von Messwerten, aufgenommenen von einem Sensor und geglättet.

Die Y-Werte sind in yd, die X-Werte in xd angehangen.

Der Verlauf soll für Simulink durch zwei PT2 Elemente angenähert werden.

Jetzt würde ich gerne die nlinfit Funktion nutzen um meine schon erstellte Funktion an die Messwerte zu fitten.

Ich würde das gerne machen wie im Folgenden Link:

http://itp.tugraz.at/LV/kernbich/Ap.....TION001114000000000000000

im untersten Beispiel (unterster Plot).

So soll der Plot später aussehen, nur von den Dimensionen her ähnlich, wie xd,yd:

Code:


Entwurf =  '(1/2*(1 + sign(x+0)))*10*(1 - 2*exp(-x/2) + exp(-x)) + (-10 + 10*(1 - 2*exp((x-15)/2) + exp(x-15))*(1/2*(1 + sign((-x)+15))))';

% Plotten:
fplot(Entwurf,[-1,17])

 


Meine Umsetzung zum Fit:

Code:


Modell   = '(1/2*(1 + sign(x-T(7))))*T(5)*(1 - T(1)/(T(1)-T(2))*exp(-(x-T(7))/T(1)) + T(2)/(T(1)-T(2))*exp(-(x-T(7))/T(2))) + (-T(5) + T(5)*(1 - T(3)/(T(3)-T(4))*exp((x-T(6))/T(3)) + T(4)/(T(3)-T(4))*exp(x-T(6)/T(4)))*(1/2*(1 + sign((-x)+T(6)))))';

% Das sind die beiden PT2 Elemente, entschuldigung, dass es so lang ist.

fa  = inline(Modell,'T','x');

as1 = [1,1,1,1,1,1,1];

af1 = nlinfit(xd,yd,fa,as1);

 


Leider kommt folgende Fehlermeldung, mit der ich nichts anfangen kann. Ich vermute, dass das Problem in der "as1" Variablen liegt, ich weiß aber auch nicht genau, was die macht, ausser, dass sie was mit den Parametern der Funktion zu tun hat.

"Inner matrix dimensions must agree."

Was mache ich falsch?


Schonmal vielen vielen Dank für Eure Hilfe!
Markus

Fit.rar
 Beschreibung:
Messwerte

Download
 Dateiname:  Fit.rar
 Dateigröße:  57.79 KB
 Heruntergeladen:  538 mal
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: 19.08.2012, 22:35     Titel:
  Antworten mit Zitat      
Hallo,

die Funktion muss komponentenweise ausgewertet werden können, d.h. du musst an einigen (sicherheitshalber an allen) Stellen * durch .* ersetzen.

Die verwendete Notation ist veraltet; es gibt seit einigen Jahren Function Handles für diesen Zweck. Ich empfehle zum Verständnis und zur Anwendung von Befehlen generell eher die Dokumentation zu verwenden als irgendwelche Links.

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

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 19.08.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2012, 11:27     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank erstamal. Ich habe jetzt die Funktion folgendermaßen aufgestellt:

Code:


Modell = @(1/2.*(1 + sign(x-T(7)))).*T(5).*(1 - T(1)/(T(1)-T(2)).*exp(-(x-T(7))/T(1)) + T(2)/(T(1)-T(2)).*exp(-(x-T(7))/T(2))) + (-T(5) + T(5).*(1 - T(3)/(T(3)-T(4)).*exp((x-T(6))/T(3)) + T(4)/(T(3)-T(4)).*exp(x-T(6)/T(4))).*(1/2.*(1 + sign((-x)+T(6)))));

 


Damit läuft der Code zwar an, gibt aber folgende Fehlermeldungen aus:

Code:


Warning: Rank deficient, rank = 4,  tol =   5.8840e-010.
> In nlinfit>LMfit at 294
  In nlinfit at 166
Warning: Rank deficient, rank = 4,  tol =   1.8524e-009.
> In nlinfit>LMfit at 321
  In nlinfit at 166

% Ausserdem

??? Error using ==> nlinfit>checkFunVals at 356
MODELFUN has returned Inf or NaN values.

Error in ==> nlinfit>LMfit at 303
    if funValCheck && ~isfinite(sse), checkFunVals(r); end

Error in ==> nlinfit at 166
    [beta,J,lsiter,cause] = LMfit(X,y, model,beta,options,verbose,maxiter);

 


Functionhandels habe ich noch nicht benutzt, weil ich nicht verstehe, wie ichs machen soll und was es bringt.

Ich weiß einfach nicht, wie ich nlinfit zu benutzen habe und kann deshalb die Fehlermeldungen auch nicht interpretieren.

Gibt es vielleicht eine andere Möglichkeit das Problem zu lösen?


Vielen Dank
Markus
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: 20.08.2012, 11:48     Titel:
  Antworten mit Zitat      
Hallo,

was die Fehlermeldung angeht: anscheinend versucht nlinfit Werte einzusetzen, für die die Funktion nicht definiert ist.

Ich würde die Funktion in eine Datei stecken und eine Abfrage auf Nan oder Inf machen, und solche Funktionswerte dann durch etwas sinnvolles ersetzen.

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