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

Levenberg-Marquardt Optimierung: 1 Gleichung, 2 Unbekannte

 

Levis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2021, 09:16     Titel: Levenberg-Marquardt Optimierung: 1 Gleichung, 2 Unbekannte
  Antworten mit Zitat      
Hallo zusammen,

ich stehe vor folgendem Problem: Ich habe flächige Daten in der Zeit, also Matrizen der Form A=B=300x445x301. Ich möchte eine Gleichung ln(A) = ln(C) + m * ln(B) lösen, sodass die Summe der Abweichung für C und m möglichst klein wird. Am Schluss erwarte ich eine Lösung für C und m der Dimension 300x445. Ich dachte ich mache das über eine Levenberg-Marquardt Optimierung, scheitere aber an der Implementierung bei zwei Unbekannten. Kann mir dabei jemand helfen?

Vielen Dank und viele Grüße

Levis


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.428
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.11.2021, 14:43     Titel:
  Antworten mit Zitat      
Hallo,

da kann man die 300*445 Probleme unabhängig voneinander sehen?
Um ln(C) und m für eine Reihe von 301 Elementen zu finden, kannst du polyfit verwenden oder das Gleichungssystem selbst aufstellen und mit \ lösen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Levis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2021, 14:19     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für den ersten Tipp. Ja, man kann das Ganze als 300*445 unabhängige Probleme betrachten und ich möchte für die Optimierung immer 201 Datenpunkte in Betracht ziehen. Ich habe es nun über zwei Schleifen mit lsqnonlin versucht:

Code:

for i=1:300
    for j=445
fun = @(z)log(z(1))+z(2).* log(Re(i,j,101:301)) + log(Pr(i,j,101:301).^(1/3)) - log(Nu(i,j,101:301));                    
x0 = [0.25 0.8];
lb = [0 0];
ub = [1 5];
% options.Display = 'none';
options.Algorithm = 'levenberg-marquardt';
CM = lsqnonlin(fun,x0,lb,ub,options);
C_LM(i,j) = CM(1);
m_LM(i,j) = CM(2);
    end
end
 


Gibt es eine elegantere und besonders schnelle Variante?

Besten Dank und viele Grüße
Levis
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.428
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.11.2021, 15:09     Titel:
  Antworten mit Zitat      
Hallo,

lsqnonlin ist für nichtlineare Ausgleichsprobleme gedacht. Man kann damit natürlich auch lineare Ausgleichsprobleme lösen, aber es ist bei weitem nicht so effizient. Mein Vorschlag wäre polyfit gewesen. Was spricht dagegen, das so zu versuchen?
Wenn du einen Beispieldatensatz zur Verfügung stellst, kann ich es gerne daran demonstrieren, wie ich das meine.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Levis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2021, 08:36     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für Deinen Tipp. Ich habe es jetzt über die cftoolbox versucht. Das funktioniert auch, ist aber extrem langsam. Funktioniert polyfit bei einem dreidimensionalen Datensatz? Ich hätte es gerne über einen Levenberg-Marquardt Ansatz und der Möglichkeit eines Bisquare-Verfahren gemacht um meine Datenpunkte direkt zu gewichten. Was hauptsächlich mein Problem mit der polyfit-Funktion ist, ist, dass ich noch keine Möglichkeit gefunden habe eine untere Grenze für die Variablen festzulegen. Das sollte doch eigentlich aber auch möglich sein, oder?

Hier mein bisheriger code:
Code:

m_LM = zeros(446,301);
C_LM = zeros(446,301);
for j=1:446
    for i=1:301
        if isnan(Nu_Dia(i,j,:))
        m_LM(i,j)=0;
        C_LM(i,j)=0;
        else
        [xData, yData, zData] = prepareSurfaceData(Re_Dia(i,j,51:301),Pr_Dia(i,j,51:301),Nu_Dia(i,j,51:301));
        ft = fittype( 'C * x^m * y^(1/3)', 'independent', {'x', 'y'}, 'dependent', 'z' );
        opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
        opts.Algorithm = 'Levenberg-Marquardt';
        opts.Display = 'Off';
        opts.Robust = 'Bisquare';
        opts.StartPoint = [0.01 0.8];
        [fitresult, gof] = fit( [xData, yData], zData, ft, opts );
        m_LM(i,j)=fitresult.m;
        C_LM(i,j)=fitresult.C;
        end
    end
end
 


Besten Dank vorab mal wieder für Deine Hilfe!

Viele Grüße
Levis

Re_Dia.mat
 Beschreibung:

Download
 Dateiname:  Re_Dia.mat
 Dateigröße:  2.48 MB
 Heruntergeladen:  169 mal
Pr_Dia.mat
 Beschreibung:

Download
 Dateiname:  Pr_Dia.mat
 Dateigröße:  2.48 MB
 Heruntergeladen:  167 mal
Nu_Dia.mat
 Beschreibung:

Download
 Dateiname:  Nu_Dia.mat
 Dateigröße:  2.49 MB
 Heruntergeladen:  169 mal
 
Harald
Forum-Meister

Forum-Meister


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

da es komplexer und objektorientiert aufgebaut ist, würde ich erwarten, dass die Curve Fitting Toolbox langsamer ist als lsqnonlin. Die folgenden Zeilen sind doch in jeder Iteration gleich? Dann würde ich sie vor die for-Schleifen ziehen:

Code:
       ft = fittype( 'C * x^m * y^(1/3)', 'independent', {'x', 'y'}, 'dependent', 'z' );
        opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
        opts.Algorithm = 'Levenberg-Marquardt';
        opts.Display = 'Off';
        opts.Robust = 'Bisquare';
        opts.StartPoint = [0.01 0.8];


polyfit funktioniert für die ursprüngliche Frage, nicht für die aktuelle.

Generell meine Empfehlungen für die Kurvenanpassung:
1. Polynomanpassung ohne Nebenbedingungen --> polyfit oder Gleichungssystem selbst aufstellen und mit \ lösen.
2. Linear in den Parametern ohne Nebenbedingungen --> Gleichungssystem selbst aufstellen und mit \ lösen.
3. Linear in den Parametern mit Nebenbedingungen--> lsqlin
4. Nichtlinear in den Parametern --> lsqnonlin
Für die aktuelle Problemstellung würde ich also lsqnonlin verwenden.

Zitat:
Was hauptsächlich mein Problem mit der polyfit-Funktion ist, ist, dass ich noch keine Möglichkeit gefunden habe eine untere Grenze für die Variablen festzulegen. Das sollte doch eigentlich aber auch möglich sein, oder?

In polyfit nicht. Wenn du das machen möchtest, würde ich lsqlin verwenden.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Levis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2021, 15:56     Titel:
  Antworten mit Zitat      
Hallo Harald,

nochmal vielen Dank für die schnelle Antwort und die Tipps! Die Zeilen werde ich vor die Schleife setzen und auch lsqnonlin mal ausprobieren. Vielleicht kann ich so die Rechenzeit merklich reduzieren.

Beste Grüße
Levis
 
Harald
Forum-Meister

Forum-Meister


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

eine andere Strategie wird noch logarithmieren sein. Dadurch wird dein momentanes, nichtlineares Modell zu
log(C) + m*log(x) + 1/3*log(y)
was linear ist und somit mit lsqlin deutlich effizienter zu lösen sein sollte.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.428
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.12.2021, 19:09     Titel:
  Antworten mit Zitat      
Hallo,

Nachteil allerdings: die kleinste-Quadrate-Minimierung würde ja im logarithmierten Modell erfolgen. Im ursprünglichen Raum ist das also keine kleinste-Quadrate-Minimierung mehr. Eine Alternative kann hier fitglm sein.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Levis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.12.2021, 15:33     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für den Tipp. Das Logarithmieren hatte ich auch schon versucht, dann jedoch teilweise komplexe Werte bezihungsweise den Logarithmus einer negativen Zahl (der Konstanten C) erhalten. Allerdings hatte ich das nur über das cftool versucht gehabt, ich kann es nochmal mit lsqlin versuchen. Besten Dank Dir und viele Grüße

Levis
 
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.