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

lsqnonlin with mutltiple input and output parameter

 

Lewis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2022, 09:08     Titel: lsqnonlin with mutltiple input and output parameter
  Antworten mit Zitat      
Hallo zusammen,

ich möchte gerne eine Gleichung der Form:
Code:

h_aw = h_W./(gamma-(gamma-1).*(((1-exp(h_e.^2.*t./k).*erfc(h_e.*sqrt((t))./sqrt(k))).*(T_F-T_0)+T_0)-T_W)./(T_F-T_W))
 


lösen. Dabei sind die drei Variablen gamma, h_aw und h_e linear unabhängig und gesucht. Für alle drei erwarte ich jeweils einen Wert.
h_W, t, T_F und T_W sind Vektoren der Größe 301x1 und T_0 beziehungsweise k sind Konstanten.

Ich bin im Netz auf folgende Möglichkeit gestoßen, weiß jedoch nicht, was ich für xdata annehmen muss:

Code:

options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
fun = @(x,T_W,T_0,T_F,t,k) (x(1).*(x(2)-(x(2)-1).*(((1-exp(x(3).^2.*t./k).*erfc(x(3).*sqrt((t))./sqrt(k))).*(T_F-T_0)+T_0)-T_W)./(T_F-T_W)));
xdata = zeros(numel(T_W)*numel(T_0)*numel(T_F)*numel(t)*numel(k),1);
ydata = h_W;
x0 = [175 1 175];
lb = [100, 0.5, 100];
ub = [200, 1.5, 200];
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options);


Kann man das Problem überhaupt so lösen oder bin ich auf dem falschen Weg? Freu mich über jeden Hinweis!

Vielen Dank und viele Grüße

Lewis

Downloads.zip
 Beschreibung:
Input-Variablen

Download
 Dateiname:  Downloads.zip
 Dateigröße:  8 KB
 Heruntergeladen:  144 mal


Harald
Forum-Meister

Forum-Meister


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

im Titel schreibst du ja von lsqnonlin. Wenn du kein xdata in dem Sinn hast, dann ist es am einfachsten, lsqnonlin statt lsqcurvefit zu verwenden.
Beim Function Handle ist vorne nur die Variable mit den zu identifizierenden Parametern anzugeben:
Code:

Die gegebenen Parameter werden dann automatisch aus dem Haupt-Workspace geholt.

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
 
Lewis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2022, 12:40     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für den Tipp. Ich bin jetzt schon recht weit gekommen und hab es mal exemplarisch für vier Gleichungen gemacht. Gibt es eine "schöne" Schreibweise das für 300 Gleichungen zu machen?

Code:

            options = optimoptions('lsqnonlin','Algorithm','levenberg-marquardt','Display','none');
            fun = @(x) [(x(1).*(x(2)-(x(2)-1).*(((1-exp(x(3).^2.*t1./k).*erfc(x(3).*sqrt((t1))./sqrt(k))).*(T_F1-T_0)+T_0)-T_W1)./(T_F1-T_W1)))-h_W1 ; ...
                (x(1).*(x(2)-(x(2)-1).*(((1-exp(x(3).^2.*t2./k).*erfc(x(3).*sqrt((t2))./sqrt(k))).*(T_F2-T_0)+T_0)-T_W2)./(T_F2-T_W2)))-h_W2 ; ...
                (x(1).*(x(2)-(x(2)-1).*(((1-exp(x(3).^2.*t3./k).*erfc(x(3).*sqrt((t3))./sqrt(k))).*(T_F3-T_0)+T_0)-T_W3)./(T_F3-T_W3)))-h_W3 ; ...
                (x(1).*(x(2)-(x(2)-1).*(((1-exp(x(3).^2.*t4./k).*erfc(x(3).*sqrt((t4))./sqrt(k))).*(T_F4-T_0)+T_0)-T_W4)./(T_F4-T_W4)))-h_W4];
            x0 = [150 1 150];
            lb = [50, 0.8, 5];
            ub = [250, 1.2, 300];
            x = lsqnonlin(fun,x0,lb,ub,options);
 


Vielen Dank für Deine Hilfe und viele Grüße
Lewis
 
Harald
Forum-Meister

Forum-Meister


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

du kannst t, T_F, T_W, h_W auch direkt als Vektoren 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
 
Lewis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2022, 07:50     Titel:
  Antworten mit Zitat      
Hallo Harald,

Du meinst vermutlich so:

Code:

            T_W = T_W_areal(i,j,:);
            h_W = h_W_areal(i,j,:);
            T_0 = T_W_areal(i,j,1);
            T_F = T_HW(:,1);
           
            t = (0:0.5:150)';
            options = optimoptions('lsqnonlin','Algorithm','levenberg-marquardt','Display','none');
            fun = @(x) (x(1).*(x(2)-(x(2)-1).*(((1-exp(x(3).^2.*t./k).*erfc(x(3).*sqrt((t))./sqrt(k))).*(T_F-T_0)+T_0)-T_W)./(T_F-T_W)))-h_W;
            x0 = [150 1 200];
            lb = [50, 0.8, 50];
            ub = [250, 1.2, 250];
            x = lsqnonlin(fun,x0,lb,ub,options);
            h_aw(i,j) = x(1);
            gamma(i,j) = x(2);
            h_e(i,j) = x(3);    
 


Dabei sind t, T_F, T_0, T_W und h_W Vektoren (301 x 1). Verstehe ich es richtig, dass in fun dann quasi 301 Gleichungen für 3 Variablen stehen, die anschließend über eine Regression mit dem Levenberg-Marquardt Algorithmus gelöst wird?

Vielen Dank für die Tipps und die Hilfe!

Beste Grüße Lewis
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.427
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.04.2022, 08:42     Titel:
  Antworten mit Zitat      
Hallo,

kann man so sagen. Details zum Vorgehen findest du in der Doku im Abschnitt "Algorithms" und den dortigen Links.
Ich würde mir hier von lsqnonlin auch mindestens vier Argumente zurückholen, damit du überprüfen kannst, ob lsqnonlin konvergiert hat (exitflag > 0) und ob die Residuen in einem akzeptablen Rahmen sind.

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
 
Lewis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2022, 10:47     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für den Tipp. Was sind den klassischerweise sinnvolle Residuen? Im Optimalfall sollte das Residuum 0 sein, oder?

Beste Grüße
Lewis
 
Harald
Forum-Meister

Forum-Meister


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

das hängt sehr von deinen Daten ab. Man könnte aus den Residuen z.B. auch das R^2 berechnen.
https://de.wikipedia.org/wiki/Bestimmtheitsma%C3%9F
In der Graphik sieht man auch schön, dass je nach Daten 99%, vielleicht aber auch nur 50% möglich sein können.
Ich finde es nur wichtig, dass man sich das überhaupt mal ansieht und sich darüber im klaren ist, wie gut (oder schlecht) die Anpassung ist. Bei nichtlinearer Optimierung gibt es zudem ja immer die Gefahr eines lokalen Minimums.

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
 
Lewis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2022, 13:22     Titel:
  Antworten mit Zitat      
Hallo Harald,

das ist bei Wikipedia echt schön erklärt. Danke für den Link. Mir ist mittlerweile noch was aufgefallen, was ich nicht verstehe: Je nachdem ob ich meine Inputparameter T_W und h_W über Möglichkeit 1 oder 2 initialisiere, erhalte ich verschiedene Lösungen für x(1), x(2) und x(3). T_W_areal und h_W_areal sind dabei Matrixen der Größe (300x445x301) und ich iteriere für jeden Pixel über i und j.

Code:

% Möglichkeit 1
            T_W = T_W_areal(i,j,:);
            h_W = h_W_areal(i,j,:);
% Möglichkeit 2
            T_W(:,1) = T_W_areal(i,j,:);
            h_W(:,1) = h_W_areal(i,j,:);
 


Bei Möglichkeit 1 erhalte ich T_W als 1x1x301 und bei Möglichkeit 2 als 301x1. Die Werte sind jedoch identisch.

Wo liegt hier mein Denkfehler, dass die beiden Möglichkeiten nicht dasselbe liefern? Oder liegt das an der punktweisen Multiplikation innerhalb von fun?

Code:

            options = optimoptions('lsqnonlin','Algorithm','levenberg-marquardt','Display','none');
            fun = @(x) (x(1).*(x(2)-(x(2)-1).*(((1-exp(x(3).^2.*t./k).*erfc(x(3).*sqrt((t))./sqrt(k))).*(T_F-T_0)+T_0)-T_W)./(T_F-T_W)))-h_W;
            x0 = [150 1 150];
            lb = [50, 0.8, 50];
            ub = [250, 1.2, 250];
            [x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,lb,ub,options);
 


Beste Grüße
Lewis
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.427
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.04.2022, 13:51     Titel:
  Antworten mit Zitat      
Hallo,

sinnvoller ist hier sicher die zweite Möglichkeit, alternativ
Code:
T_W = squeeze(T_W_areal(i,j,:));

Du kannst die Funktion ja für die Anfangswerte auswerten und schauen, was da jeweils rauskommt und ob das sinnvoll ist:
Code:


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