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?
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 ;)
Levis
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.11.2021, 14:19
Titel:
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.250.8];
lb = [00];
ub = [15];
% 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
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 ;)
Levis
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.12.2021, 08:36
Titel:
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?
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:
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 ;)
Levis
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.12.2021, 15:56
Titel:
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.
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 ;)
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 ;)
Levis
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 20.12.2021, 15:33
Titel:
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
Einstellungen und Berechtigungen
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
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.