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

Funktion an Messwerte approximieren

 

tschraud

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2014, 15:14     Titel: Funktion an Messwerte approximieren
  Antworten mit Zitat      
Hallo,
ich habe mit Matlab ein GUI erstellt mit dem ich Messwerte einlesen und plotten kann. Nun möchte ich diese Messwerte mit einer Funktion approximieren. Die Funktion soll die Form
f(x)= (x²-1/x^4)*(2*C01+2*x²*C10) haben. Als Ergebnis möchte ich dann Werte für C01 und C10 bekommen.
Ich hab herausgefunden, das es mit dem fminsearch Befehl funktioniert. Allerdings hat mich ein Blick in die Matlab Hilfe auch nicht schlauer gemacht, ich hoffe ihr könnt mir jetzt helfen.

Mit freundlichen Grüßen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 25.08.2014, 15:58     Titel:
  Antworten mit Zitat      
Hallo,

ja das geht mit fminsearch. Hier ein ausführliches Beispiel:
Ich generiere mir zuerst Beispieldaten, da ich deine Daten nicht habe. Hier kannst du dein echtes "x" und "y" einfach benutzen. Du musst die Startwerte für par0 vermutlich an dein Problem anpassen, da die Optimierung möglicher Weise in ein lokales Minimum fällt, wenn die Startwerte schlecht gewählt sind. Viel Spaß beim Rumprobierne:
Code:
function main

%% ----- BEISPIELDATEN ----- %
x = sort(rand(50,1)*1.5)+0.5;
C01 = rand();
C10 = rand()*2;
par = [C01, C10];

% Daten als Ergebnis der fit Funktion und Rauschen
y = fit_function(x, par) + (rand(size(x))-0.5)*0.2;

% ----- OPTIMIERUNG ----- %
par0 = [0.5,1]; % Startwerte für Parameter raten
par_fit = fminsearch(@objFun, par0);

%% ----- OBJECTIVE FUNCTION (wird minimiert) ----- %
function e = objFun(par)
    yfitted = fit_function(x, par);
    e = sum((yfitted-y).^2);    % minimiere Abstandsquadrat zwischen Fit und Messung y
end

%% ----- ERGEBNISSE DARSTELLEN ----- %
figure
plot(x,y,'ko')  % Verrauschte Daten
hold on
plot(x,fit_function(x,par_fit),'rx-')   % Fit
legend('Verrauschte Daten','Optimierte Fit-Funktion')
par
par_fit

end

%% ----- FIT-FUNKTION ------ %
function yfitted = fit_function(x, par)
% f(x)= (x²-1/x^4)*(2*C01+2*x²*C10)
    C01 = par(1);
    C10 = par(2);
   yfitted = (x.^2-1./x.^4).*(2*C01+2*x.^2*C10);
end


Das Ergebnis sieht hier so aus:
Viele Grüße,
Nras.

optimierung_gomatlab.png
 Beschreibung:

Download
 Dateiname:  optimierung_gomatlab.png
 Dateigröße:  14.05 KB
 Heruntergeladen:  387 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
tschraud

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2014, 17:33     Titel:
  Antworten mit Zitat      
Hallo,
auf jeden Fall schonmal Danke für deine Antwort.
Ich bin allerdings leider noch kompletter Anfänger in Matlab, deswegen ist mir noch nicht so klar wie ich den Code einbaue. Die Aktion soll durch einen Pushbutton ausgelöst werden. Muss ich deinen Code dann als seperate function schreiben, die dann in der Callback function aufgerufen werden?

Ist wahrscheinlich Basiswissen, aber hab nix gefunden was es mir verständlich erklärt.

Grüße
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 25.08.2014, 18:08     Titel:
  Antworten mit Zitat      
Hallo,

ich benutze keine GUIs. Dafür eventuell noch eine Extrafrage im GUI-Unterforum eröffnen.
Du musst nur irgendwie dafür sorgen, dass x, y und par0 bereitliegen. Alles andere erledigt die Funktion dann. Hier musst du gerade x, y und par0 manuell eintippen. Vielleicht lässt sich das auch mit Klicken in einem GUI lösen.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
tschraud

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2014, 18:32     Titel:
  Antworten mit Zitat      
Hallo,
ok sehr gut. x und y hab ich gegeben und eine Näherung für par0 kann ich berechnen. Dann werde ich mal gucken ob ich es irgendwie eingebaut bekomme, bzw wo anders nachfragen. Dir auf jeden Fall schonmal ein Dankeschön!

Grüße
 
tschraud

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2014, 16:56     Titel:
  Antworten mit Zitat      
Hallo nochmal,
hab es jetzt geschafft die Funktion so einzubauen, das es mit meinen Daten funktioniert. Hätte nur noch eine Frage bezügliche dieses Punktes.
Code:

C01 = rand();
C10 = rand()*2;
par = [C01, C10];
.
.
par0 = [0.5,1]; % Startwerte für Parameter raten
 


par0 kann ich abschätze. Kann ich diese Werte dann auch als C01 C10 Werte in dem obigen Code einsetzen, oder warum werden für diese zufällige Werte generiert?

Mit freundlichen Grüßen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 27.08.2014, 17:57     Titel:
  Antworten mit Zitat      
Hey,

ich habe ja deine Daten nicht zur Verfügung, darum habe ich Beispieldaten erzeugt mit zufälligen Parametern. C01 ist irgendwas zwischen 0 und 1 (Ewartungswert 0.5) und C10 ist irgendwas zwischen 0 und 2 (Erwartungswert 1). Mit denen habe ich dann x und y erzeugt, um später herauszufinden, was wohl C01 und C10 ursprünglich war.

Du hast ja bereits x und y durch eine Messung/Modell/irgendwas gegeben und musst sie nicht erst erzeugen. Schließlich weißt du die Werte für C01 und C10 auch nicht vorher -dann wäre das ja witzlos.

Zusammenfassend:
Du musst die 4 Zeilen unter dem Kommentar BEISPIELDATEN gar nicht benutzen, sondern beginnst erst darunter.

par0 habe ich dann mit den Erwartungswerten für die Variablen besetzt, eben als Startwert.

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