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

least square Verfahren - Variable einer Funktion bestimmen

 

mishka84
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 30.10.13
Wohnort: München
Version: ---
     Beitrag Verfasst am: 30.10.2013, 16:39     Titel: least square Verfahren - Variable einer Funktion bestimmen
  Antworten mit Zitat      
Hallo Leute,
stehe vor folgendem Problem: habe die Funktion für einen Temperaturverlauf
T(x)=T(O)+((T(inf)-T(0)*L*x)/(1-(1-L)*x))ausserdem hab ich durch Experimente
12 einzelne T in abhängigkeit von x bestimmt
Gefragt ist nun folgendes- ich soll die zweite Variable L so bestimmen, das der Kurvenverlauf T(x) so nah wie möglich an meine experimentell bestimmten Punkte rankommt d.h. die Summe der quadrate der Abweichungen soll minimiert werden. Ich weiss des hört sich jetzt kompliziert an....falls ihr etwas net versteht versuch ichs anders zu erklären......
1 Frage: wie bringe ich Ihn überhaupt dazu die Funktion für ein bestimmtes L zu plotten / bis jetzt habe ich einen Vektor eingegeben mit den Werten für x / Wenn ich dann aber die Funktion eingeben will y=T(0)+.......dann nimmt er nicht die einzelnen Werte für x aus dem Vektor sondern nur einen(irgendwie denk ich er nimmt den Betrag) und rechnet dann mit diesem Betrag nur ein T aus, weshalb der Plot mir nur Punkte mir fixem y-Wert (also mit fixem T) liefert....
hoffe mir kann einer von euch helfen...vielen dank
Private Nachricht senden Benutzer-Profile anzeigen


mishka84
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 30.10.13
Wohnort: München
Version: ---
     Beitrag Verfasst am: 30.10.2013, 18:03     Titel:
  Antworten mit Zitat      
hallo nochmal...bin grad am stöbern...ich glaube es läuft bei meinem Problem auf das lsqcurvefit hinaus.......habe aus Messungen meine xData (Aushärtegrad) und mein yData (Glasübergangstemperatur)....
in der Formel kommt die Variable L vor welche optimiert werden soll, sodass die durch die Gleichung beschriebene Kurve möglichst gering von meinen Messwerten abweicht.....hab bisher folgendes geschrieben

Lambda = 0.1;
>> x(1)=Lambda;
>> F= @(x,xData) Tgo+(((Tginf-Tgo)*x(1)*xData)/(1-(1-x(1))*xData));
>> [xbest,resnorm]=lsqcurvefit(F,x0,xData,yData);

Tgo;Tginf sind konstanten
xData (Aushärtegrad); yData (Glasübergangstemperatur) sind Zeilenvektoren
mit 12 Zeilen
Lambda soll so bestimmt werden das die Abweichung von den Messdaten möglichst gering ist......
wenn ich des so eingebe kommt folgender Fehler

Error using lsqcurvefit (line 248)
Function value and YDATA sizes are not equal.

sprich die Größe stimmen net überein......was tun??
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: 30.10.2013, 22:11     Titel:
  Antworten mit Zitat      
Hallo,

gibt dir
Code:

denn etwas vernünftiges zurück?

Wenn nicht, musst du möglicherweise komponentenweise Operationen wie ./ statt Operationen wie / nutzen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 30.10.13
Wohnort: München
Version: ---
     Beitrag Verfasst am: 01.11.2013, 00:29     Titel:
  Antworten mit Zitat      
hallo harald......danke das du dich der sache hier annimmst.....
will dir nochmal kurz sagen was ich vom start von matlab an mache....
ich definiere die konstanten ( Tgo Tginf Lambda)
danach definiere ich die vektoren ( xData sind der Aushärtegrad / yData sind die Glasübergangstemperaturen (Zeilenvektoren mit jeweils 12 Zeilen) )
Danach tue ich analog zu einem hier schon bearbeiteten fall folgendes....
ich definiere x0 mit einem bestimmten Wert ( Wert für Lamba )
Danach lege ich eine weitere variable an x(1) = Lambda
anschließend gebe ich die funktion ein

>> F= @(x,xData) Tgo+(((Tginf-Tgo)*x(1)*xData)./(1-(1-x(1))*xData))

und als nächstes

[xbest,resnorm]=lsqcurvefit(F,x0,xData,yData)



hier nochmal der komplette code

>> clear all
>> Tginf=127.36;
>> Tgo=-44.33;
>> xData=[0.184 0.247 0.358 0.445 0.502 0.588 0.599 0.617 0.755 0.757 0.851 0.883]';
>> yData=[-31.45 -27.21 -16.42 -3.45 -9.74 21.26 11.91 9.3 46.36 32.92 76.45 57.88]';
>> Lambda = 0.1;
>> x0=[0.1;]

x0 =

0.1000

>> x(1)=Lambda;
>> F= @(x,xData) Tgo+(((Tginf-Tgo)*x(1)*xData)./(1-(1-x(1))*xData));
>> [xbest,resnorm]=lsqcurvefit(F,x0,xData,yData);

Local minimum possible.

lsqcurvefit stopped because the final change in the sum of squares relative to
its initial value is less than the default value of the function tolerance.

<stopping criteria details>

ich glaube nur durch den punkt mit dem ich komponentenweise operationen durchführe gibt mir die funktion jetzt nen passablen wert raus.....

es erscheinen zwei weitere variablen im workspace

xbest = 0.3163

resnorm = 819

is dies nun schon mein optimales Lambda /
was bedeutet der Wert für resnorm....is des die summe der quadratischen Abweichung???
und was will mir die fehlermeldung sagen???wenn ich unter stopping criteria gehe dann steht dort soviel wie.....optimierung wurde gestoppt weil die änderung der summe der abweichungen sich um weniger als 1e-06 ändert......
des heisst doch das des optimale Lambda gefunden wurde..

danke
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: 01.11.2013, 00:39     Titel:
  Antworten mit Zitat      
Hallo,

die Meldung ist keine Fehlermeldung, sondern eine Statusmeldung, die Erfolg signalisiert.

Du möchtest doch eine Kurve fitten, dann plotte doch die Kurve mal für diesen Parameter. Wenn das sehr schlecht ist, solltest du es mal mit anderen Startwerten versuchen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 30.10.13
Wohnort: München
Version: ---
     Beitrag Verfasst am: 01.11.2013, 11:16     Titel:
  Antworten mit Zitat      
hallo nochmal harald........PERFECT!!!!!!!!!!!!!is super gelungen.....
jetzt habe ich noch paar fragen an dich und hoffe du kannst mich aufklären......versuche alles aus den doc files zu erlesen aber des english da macht mir ziemlich zu schaffen......da ich das vorgehen hier im forum nachgeschaut habe bleiben doch noch paar fagen zum vorgehen....ich schreib einfach mal was ich denke und hoffe du korrigierst mich falls nötig

1) mit der Zeile x0=[0.1;] definiere ich mir den Startwert von x / dieser ist beliebig und bildet mir den Startpunkt der optimierung

2) die Zeile >> x(1)=Lambda; mit dieser weise ich der variablen x(1) in meiner formel den Wert für lambda zu / Warum muss ich dies so machen / wenn ich in der formel statt x(1) aber Lambda einsetze dann optimiert er nicht sondern gibt mir für xbest den Wert von x0 wieder....

3) mit der Zeile F= @(x,xData) Tgo+(((Tginf-Tgo)*x(1)*xData)./(1-(1-x(1))*xData)); gebe ich matlab eine Funktion vor die er optimieren soll......die frage ist hierbei was bewirkt das @(x,xData).......komme an dieser Stelle gar nicht klar

4) mit der Zeile [xbest,resnorm]=lsqcurvefit(F,x0,xData,yData); sage ich matlab, es soll mir 2 Konstanten mit dem lsq-Verfahren ermitteln (xbest, resnorm)........is des soweit richtig.....hoffe du kannst mir bei den punkten die unklar sind helfen.......vielen dank
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: 01.11.2013, 20:17     Titel:
  Antworten mit Zitat      
Hallo,

1) Beliebig ist übertrieben. Da im Hintergrund ein Gradientenverfahren (Richtung des steilsten Abstiegs) läuft, besteht bei einem schlechten Startwert die Gefahr, dass die Lösung nicht das globale Minimum ist.

2) Du musst nicht x verwenden, aber es muss mit der Variablenliste zusammenpassen. Genauso könntest du schreiben:
F= @(lambda,xData) Tgo+(((Tginf-Tgo)*lambda*xData)./(1-(1-lambda)*xData));

3) Das ist ein anonymous function handle. Bitte in der Doku genauer nachlesen.

4) Ja, mit dem Aufruf holst du dir zwei Rückgabeargumente zurück. xbest ist der optimale Parameter(vektor), resnorm ein Gütemaß - siehe auch Doku.

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.