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

[Optimization Toolbox]-Mehrere Eingangsgrößen

 

Coja
Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 20.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2010, 16:22     Titel: [Optimization Toolbox]-Mehrere Eingangsgrößen
  Antworten mit Zitat      
Hallo,

ich habe folgendes Problem: Ich habe Meßdaten für eine Differentiallgleichung augenommen und will anhand dieser Daten, die Parameter für die Differentiallgeichung bestimmen. Es handelt sich um eine Gleichung 1. Ordnung.

Code:

% Gleichung:
'2*A*DY1 = B*Y2-(C+2/15*(Y1-Y3))*(Y1-Y3)'
% zu bestimmende konstante Parameter: A B C
% Bekannte Meßdaten (abhängig von der Zeit t): Y1(t) Y2(t) Y3(t)
% Ableitung DY1=d(Y1)/dt


 


Die Werte von A, B und C möchte ich nun so ermitteln, dass die Parameter die Gleichung bestmöglich erfüllen.
LSQ-Funktionen wie lsqcurvefit, lsgnonlin,lsqlin, qr,... wären dabei meiner Ansicht nach angebracht.

Wie kann ich die Parameter ermitteln?

Ich sehe da 2 Probleme:
1. Die Ableitung ergibt eine Fehlermeldung
2. Falls ich die Ableitung diskret bilde, wie kann ich mehr als 2 von der Zeit t abhängige Daten in einen Lösungsalgorithmus unterbringen (lsqcurvefit akzeptiert nur 2 Vektoren (XData und YData), ich habe aber 3/4 zeitabhängige Größen)

Vielen Dank schonmal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.452
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.05.2010, 17:03     Titel:
  Antworten mit Zitat      
Hallo,

ich würde das folgendermaßen angehen:
- lsqnonlin verwenden.
- in der Zielfunktion mit ode45 die DGL lösen und mit y1 vergleichen. Dabei die DGL an den Zeitschritten lösen lassen, an denen y1 vorliegt.
- um an Y2 und Y3 zu bestimmten Zeiten heranzukommen wie für die DGL nötig, muss wohl interpoliert werden.

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

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 20.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2010, 22:45     Titel:
  Antworten mit Zitat      
Hallo Harald,

Danke für deine schnelle Antwort.
Ich hab die Zeitwerte und die zugehörigen Messwerte von Y1,Y2 und Y3 (Interpolation noch nötig?). Nur die Parameter A,B,C sind unbekannt und sollen für alle Zeiten t bestmöglich angepasst werden. Kannst du mir das bitte mal beispielhaft zeigen, wie das ggf. mit lsqnonlin & Zielfunktion aussehen würde?

vg
Coja
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.452
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.05.2010, 10:20     Titel:
  Antworten mit Zitat      
Hallo,

hier mein Versuch.

Code:
function [xfinal, f] = runoptim()
[xfinal, f] = lsqnonlin(@obj, StartwertABC);
% Sämtliche Daten hier laden:
% tWerteVonY1, Y1Werte, tWerteVonY2, Y2Werte, tWerteVonY3, Y3Werte

    function y = obj(x)
        % x beinhaltet A, B, C
        [tsim, ysim] = ode45(@diffeq, tWerteVonY1, AnfangsBed);
        y = ysim - Y1Werte;
       
        function f = diffeq(t, Y1)
            f = (x(2)*Y2eval(t) - (x(3)+2/15*(Y1-Y3eval(t)))*(Y1-Y3eval(t)))/(2*x(1));
           
            function f = Y2eval(t)
                f = interp1(tWerteVonY2, Y2Werte,t,'linear');
                %könnte auch spline oder so statt linear sein
            end
           
            function f = Y3eval(t)
                f = interp1(tWerteVonY3, Y3Werte,t,'linear');
                %könnte auch spline oder so statt linear sein
            end
        end
    end
end


... aufgrund der Komplexität keine Garantie, dass das auch funktioniert...

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

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 20.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2010, 23:32     Titel:
  Antworten mit Zitat      
Hallo Harald,
danke für die Mühe, das sieht ja echt kompliziert aus mit den verschachtelten Funktionen Wink

Leider ist es mir (noch) nicht gelungen, daß mein Programm läuft Sad.
Ich hab die Messdaten mal beigefügt.
Benötige ich bei Ode45 zwingend Anfangsbedingungen und wenn ich dort keine angebe, werden die dann auf Null gesetzt?
Mal sehen ob ich das noch hinbekomme...
Lg
Coja

Untitled.zip
 Beschreibung:
Daten mit Zeitpubkten (gilt für Y1,Y2,Y3)

Download
 Dateiname:  Untitled.zip
 Dateigröße:  10.83 KB
 Heruntergeladen:  508 mal


Zuletzt bearbeitet von Coja am 22.05.2010, 23:51, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.452
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.05.2010, 23:48     Titel:
  Antworten mit Zitat      
Hallo,

da ist nichts beigefügt.
Und ja, du brauchst Anfangsbedingungen. Aber du könntest Y1Werte(1) als Anfangswert nehmen, wenn nichts anderes da ist.
Die verschachtelten Funktionen habe ich deswegen genommen, damit die Variablen sichtbar bleiben.

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

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 20.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.05.2010, 11:28     Titel:
  Antworten mit Zitat      
Hallo,
ich hab meinen Beitrag gesten noch ergänzt (Dateianhang). Da ich ja 3 verschiedene Meßwerte hab, muss ich ja eine bestimmte Anfangsbedingung vorgeben, da die Differentialgleichung in deinem Beispiel von Y1 abhängt, gebe ich demzufolge Y1 eine Anfangsbedingung, wie du schon sagtest den 1. Wert (beispielsweise). Da es sich um relative kleine Zeitschritte handelt, kann man den Fehler ja vernachlässigen... mal sehen ob ich mein Programm noch zum laufen bekomme, danke schonmal für die Hilfe.

vg
Coja
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

y1(1) ist definitiv die Anfangsbedingung, alles andere macht keinen Sinn.
Meine Zeit ist leider gerade eingeschränkt, aber ich kann in ein paar Tagen nochmal genauer draufschauen, wenn du nicht weiter kommst.

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

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 20.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2010, 15:45     Titel:
  Antworten mit Zitat      
Hallo Harald,

es eilt ja bei mir nicht so Wink Ich probiere gerade noch ein wenig, aber es kommt eine Fehlermeldung nach der nächsten...aber ich versuchs weiter. Du kannst den Beitrag auch später ergänzen (ich würde mich sehr freuen), ich sehe täglich nach.
Vielen Dank für die bisherige Mühe
viele Grüße Coja
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.452
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.05.2010, 21:20     Titel:
  Antworten mit Zitat      
Hallo,

hier lauffähiger Code:
Code:
function [xfinal, f] = runoptim(limit, x0)
load daten_fuer_gomatlab
limit = min(limit, length(Zeit_t));
p.t = Zeit_t(1:limit);
p.Y1 = Y1(1:limit);
p.Y2 = Y2(1:limit);
p.Y3 = Y3(1:limit);
options = psoptimset('Display', 'iter');
[xfinal, f] = patternsearch(@(x) obj(x, p), x0, [], [], [], [], [], [], [], options);
% Sämtliche Daten hier laden:
% tWerteVonY1, Y1Werte, tWerteVonY2, Y2Werte, tWerteVonY3, Y3Werte
end

function y = obj(x, p)
% x beinhaltet A, B, C
opts = odeset('RelTol', 1e-3); % verkleinern für zuverlässige Ergebnisse
[tsim, ysim] = ode23s(@(t,y) diffeq(t,y,x,p), p.t, p.Y1(1), opts);
if length(ysim) == length(p.Y1) && ~any(isnan(ysim))
    y = norm(ysim - p.Y1);
else
    y = 1e10;
end
end

function f = diffeq(t, Y1in, x, p)
f = (x(2)*Y2eval(t,p) - (x(3)+2/15*(Y1in-Y3eval(t,p)))*(Y1in-Y3eval(t,p)))/(2*x(1));
end

function f = Y2eval(t,p)
f = interp1(p.t, p.Y2,t,'spline');
end

function f = Y3eval(t,p)
f = interp1(p.t, p.Y3,t,'spline');
end


Ich bekam mit lsqnonlin keine vernünftigen Ergebnisse und habe daher andere Algorithmen probiert; patternsearch läuft am ehesten.

Code:
x0 = [1 1 1];
for limit = [10, 50, 200, 500, 951]
    [x0, f] = runoptim(limit, x0);
    msgbox(['f: ' num2str(f), char(10), 'x: ', num2str(x0)], ['Limit= ' num2str(limit)])
end


Vernünftige Ergebnisse bekomme ich damit jedoch auch nicht.

Ein paar Vorschläge:
1. Gleichung überprüfen
2. Messungen in feineren Abständen, um die Wirkung von Interpolationsfehlern zu verringern.
3. Möglichst gute Startwerte und untere und obere Schranken vorgeben.

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.