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

Methode der kleinsten Quadrate

 

Vontorgaddon
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 03.06.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2021, 17:31     Titel: Methode der kleinsten Quadrate
  Antworten mit Zitat      
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.9 78.87 67.76 55.12;80.57 71.86 66.77 60.42;89.34 4.12 0.57 0.04];
M = [ 81.19 62.01 53.94 42.74; 97.57 77.90 68.01 53.69; 200.6 151.38 135.67 112.47;824.61 141.93 96.44 74.71; 405.54 140.84 115.76 93.61; 644.57 351.44 293.84 230.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.9 78.87 67.76 55.12;80.57 71.86 66.77 60.42;89.34 4.12 0.57 0.04];
M = [ 81.19 62.01 53.94 42.74; 97.57 77.90 68.01 53.69; 200.6 151.38 135.67 112.47;824.61 141.93 96.44 74.71; 405.54 140.84 115.76 93.61; 644.57 351.44 293.84 230.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!

Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

Zitat:
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Vontorgaddon
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 03.06.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2021, 21:15     Titel:
  Antworten mit Zitat      
Oh mein Gott, danke!!
Da habe ich mir ne Woche lang den Kopf drüber zerbrochen, aber deine Lösung funktioniert!!!
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.