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

Messwerte durch lqcurvefit an eine vorgegebene Zielfunktion

 

epsilon92
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2015, 17:04     Titel: Messwerte durch lqcurvefit an eine vorgegebene Zielfunktion
  Antworten mit Zitat      
Hallo,

ich bin blutiger Matlab Laie und habe folgendes Problem:

Ich habe eine vorgegebene Funktion mit 3 unbekannten Parametern, der den Zusammenhang zwischen y und x beschreibt:
y= a(1)+a(2)*ln(x)+a(3)*T*ln(x).
x=[25.01 25.424 25.254 ...etc]
y=[114 118 141 ...etc]
T ist die Temperatur, bei welchem der Versuch gefahren wurde, also eine konstante Größe. Ich habe dazu Messwerte aufgenommen und möchte die Parameter a(1),a(2), a(3) der Funktion finden.
Bei vorgegebenen x und y (Messdaten) soll der Fehler zwischen der gerechneten Funktions-y und gegebenen y möglichst klein werden. (Methode der kleinste Quadrate)

Ich habe im Forum ein wenig gestöbert und habe versucht die Lösung in diesem Beitrag

http://www.gomatlab.de/messwerte-an.....h-lsqcurvefit-t22704.html

(trifft mein Problem recht genau) durchzuspielen.
Leider erscheint eine Fehlermeldung und ich weiß nicht warum.

Ich hoffe mir kann jmd helfen und bedanke mich bei denjenigen schon einmal sehr herzlich!

Hier mein Code:

Code:
% Rahmenprogramm zur Bestimmung der Parameter
 
clear
datei=fopen('fuenfundzwanzig.dat'); %Das ist meine Messwerttabelle
 
% Einlesen der Daten in eine Matrix A
 
A=fscanf(datei,'%f %f',[5 inf]);
 
fclose(datei);
 
 
x=A(3,:)'; % Eingangsgrößen (1.Spalte: T_WM; 2.Spalte: pH; 3.Spalte: eta_WM;4.Spalte: sigma;  
y=A(5,:)'; % Messdaten X_CO2
a0=[1;1;1];%Startwerte
 
XCO2_fit = a(1)+a(2)*ln(x)+a(3)*18*ln(x)
[a,resnorm]=lsqcurvefit(@ToFit,a0,x,y)
%Aufruf der Funktion
 


mit dem seperat gespeichertem Skript "ToFit.m":

Code:

function XCO2_fit=ToFit(a,x)
XCO2_fit = a(1)+a(2)*ln(x)+a(3)*18*ln(x);
 


Und nun ff. Fehlermeldung:

Code:
Undefined function 'a' for input arguments of type 'double'.

Error in Fit (line 24)
XCO2_fit = a(1)+a(2)*ln(x)+a(3)*25*ln(x)
 
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 04.08.2015, 17:15     Titel:
  Antworten mit Zitat      
hallo. sehr schöner erster post. aufs wesentliche beschränkt und alles vorhanden.
wozu hast du diese zeile im code?
Zitat:
XCO2_fit = a(1)+a(2)*ln(x)+a(3)*18*ln(x)

sie erzeugt die fehlermeldung da a nicht bekannt ist. hat aber keinen weiteren nutzen oder?
wenn du die zeile löscht könnte ich mir vorstellen das alles klappt.
anstatt eine extra funktion zu verwenden kannst du auch anonyme funktionen verwenden. ist bei kleinen funktionen manchmal schneller überschaubar aber hat erstmal nix mit deinem problem zu tun. mit hilfe von anonymen funktionen lässt sich dann auch einfach die übergabe weiterer parameter regeln falls du T zb in dein skript einbauen willst.
Code:
% Rahmenprogramm zur Bestimmung der Parameter
 
clear
datei=fopen('fuenfundzwanzig.dat'); %Das ist meine Messwerttabelle
 
% Einlesen der Daten in eine Matrix A
 
A=fscanf(datei,'%f %f',[5 inf]);
 
fclose(datei);
 
 
x=A(3,:)'; % Eingangsgrößen (1.Spalte: T_WM; 2.Spalte: pH; 3.Spalte: eta_WM;4.Spalte: sigma;  
y=A(5,:)'; % Messdaten X_CO2
a0=[1;1;1];%Startwerte  
XCO2_fit = @(a,x,T) a(1)+a(2)*log(x)+a(3)*T*log(x)
[a,resnorm]=lsqcurvefit(@(a,x) XCO2_fit(a,x,18),a0,x,y)
%Aufruf der Funktion

_________________

richtig Fragen

Zuletzt bearbeitet von Winkow am 04.08.2015, 17:26, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
epsilon92
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.08.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2015, 17:24     Titel:
  Antworten mit Zitat      
Wow ! Vielen lieben Dank für die schnelle Antowrt.
Das Löschen der Zeile führte auch zur Problembehebung!

Weiterhin ist mir aufgefallen, dass ich "ln" in der Zielfunktion geschrieben habe. Dieses muss man im Matlab unbedingt als "log" eingeben!

Code:
function XCO2_fit=ToFit(a,X)

XCO2_fit = a(1)+a(2)*log(X)+a(3)*25*log(X);
 



Allerdings beschäftigt mich diese Meldung:

Code:
>> Fit

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>


a =

   1.0e+06 *

   -0.0002
    2.4006
   -0.0960


resnorm =

  718.1810

>>
 


Ich nehme an, dass liegt an meinen schlecht gewählten Startwerten a0?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 04.08.2015, 17:31     Titel:
  Antworten mit Zitat      
Zitat:
Mein Fehler war das "ln" in der Zielfunktion. Dieses muss man im Matlab unbedingt als "log" eingeben!

das passiert mir auch öfter. ist allerdings nicht der fehler zu deiner geposteten fehlermeldung Smile
Zitat:
Ich nehme an, dass liegt an meinen schlecht gewählten Startwerten a0?
möglich. vielleicht ist aber auch das modell schlecht.
du hast zb 3 parameter. im grunde lässt sich 2 davon aber auch zusammen fassen.
Zitat:
Code:
a(2)*log(X)+a(3)*25*log(X)

ist doch erstmal das gleiche wie
Code:
a2 ist halt anders ich kann ja a2 und a3+25 zu einer variablen einfach zusammen fassen. es giebt ja sowieso keinen vorgeschriebenen zusammenhang da.
dann wären es nur noch2 parameter die du optimieren musst.
startwerte bekommt man durch gutes schätzen Smile wenn das nicht geht kann man auch mehrmals mit verschiendenen zufälligen starten.
_________________

richtig Fragen
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.