Verfasst am: 03.06.2021, 16:31
Titel: Methode der kleinsten Quadrate
Hallo MABLAB-User,
Zuerst möchte ich sagen, ich kenne mich überhaupt nicht mit MATLAB aus.
Folgendes Problem. Ich habe eine Gleichung M=beta*A, dabei ist M eine 6x4 Matrix und A eine 3x4, deren Werte ich habe. Entsprechend muss die gesuchte Matrix B eine 6x4 Matrix sein, die ich mit der Methode der kleinsten Quadrate bestimmen soll.
Jede Spalte stellt dabei eine eigene Messung dar, wobei mir meine 3 Eingangsparameter jeweils 6 Messwerte liefern. Es wurden 4 Messungen durchgeführt.
Folgende Vorgaben:
1. ich möchte eine Wichtung einführen, wobei jeder Wert von M mit 1/M^2gewichtet werden soll.
2. alle Werte von beta müssen > 0 sein.
So wie ich das sehe gibt es keine Funktion, mit der ich diese beiden Vorgaben abdecken kann.
Hier ist mein erster Versuch mit der Funktion lscov für die Wichtung, wobei jeder Wert von M mit 1/wurzel(M) gewichtet wird. Funktioniert soweit, nur bekommt ich für beta auch negative Werte, was ja nicht sein soll.
Code:
A = [99.978.8767.7655.12;80.5771.8666.7760.42;89.344.120.570.04];
M = [81.1962.0153.9442.74; 97.5777.9068.0153.69; 200.6151.38135.67112.47;824.61141.9396.4474.71; 405.54140.84115.7693.61; 644.57351.44293.84230.25];
%Wichtung mit Matrix N, für jedes Zeile von M einzeln
N=M(1,:);
V=diag(1./(N.*N));
beta1=lscov(A',N',V);
N=M(2,:);
V=diag(1./(N.*N));
beta2=lscov(A',N',V);
N=M(3,:);
V=diag(1./(N.*N));
beta3=lscov(A',N',V);
N=M(4,:);
V=diag(1./(N.*N));
beta4=lscov(A',N',V);
N=M(5,:);
V=diag(1./(N.*N));
beta5=lscov(A',N',V);
N=M(6,:);
V=diag(1./(N.*N));
beta6=lscov(A',N',V);
%Zusammenfassung als Matrix
beta = [beta1,beta2,beta3,beta4,beta5,beta6];
Ich habe es auch mal mit der lsqcurvefit Funktion probiert, da ich hier auch ein untere Grenze für beta angeben kann, auch wenn ich hier noch nicht genau weiß, wie ich die Wichtung einführen kann.
Code:
A = [99.978.8767.7655.12;80.5771.8666.7760.42;89.344.120.570.04];
M = [81.1962.0153.9442.74; 97.5777.9068.0153.69; 200.6151.38135.67112.47;824.61141.9396.4474.71; 405.54140.84115.7693.61; 644.57351.44293.84230.25];
%zugrundeliegende Funktion für den fit
fun = @(beta,A)beta(1)*A;
%Startparameter vorgeben
x0 = zeros(6,4);
%Methode der kleinsten Quadrate
beta = lsqcurvefit(fun,x0,A,M)
Es kommt jedoch folgender Fehler:
Error using lsqcurvefit (line 287)
Function value and YDATA sizes are not equal.
Error in LSQFit (line 10)
beta = lsqcurvefit(fun,x0,A,M)
Ich nehme an es liegt daran, dass beta nicht als Matrix, sondern als Skalar aufgefasst wird.
Hat jemand eine Ahnung wie man entweder entweder bei der lscov Funktion alle Werte > 0 oder denlsqcurvefit zum laufen bekomme? Bin am verzweifeln und dankbar für jede Hilfe!
Entsprechend muss die gesuchte Matrix B eine 6x4 Matrix sein
Nein, 6x3. Sonst stimmen die inneren Dimensionen von B(eta) und A nicht überein.
Zitat:
wobei jeder Wert von M mit 1/M^2gewichtet werden soll
Zitat:
wobei jeder Wert von M mit 1/wurzel(M) gewichtet wird
Was denn nun? Quadrat oder Wurzel?
Ich würde lsqnonlin verwenden, und zwar so:
Code:
fun = @(beta)beta*A - M;
%fun = @(beta)(beta*A - M)./(M.^2); % oder was auch immer
x0 = zeros(6,3);
[beta, f] = lsqnonlin(fun,x0, x0)% Untere Grenze ist auch 0
Wenn irgendwie möglich, sollte man sich als Startwert etwas besseres als Nullen einfallen lassen.
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 ;)
Oh mein Gott, danke!!
Da habe ich mir ne Woche lang den Kopf drüber zerbrochen, aber deine Lösung funktioniert!!!
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.