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

Programmierungsfehler lsqnonlin

 

Schwalla
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.07.16
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 10.01.2018, 16:38     Titel: Programmierungsfehler lsqnonlin
  Antworten mit Zitat      
Hallo,
ich beschäftige mich derzeit mit einer Programmierung für nichtlineare Ausgleichsprobleme und möchte hierfür den lsqnonlin()-Befehl nutzen. Meine Berechnung läuft zwar auch durch, aber das geplottete Ergebnis passt nicht zu meiner Punktwolke, durch die die Funktion letztlich laufen soll.

Mein Code siht bis dato wie folgt aus:
Code:
function main
%Punktwolke t,y-Werte
m.t = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
m.y = [25,22,21,19,17.5,16,14.8,13.5,12.8,12,11,10,9.5,9,8.2,7.5,7.1,6.7,6.5,6.2];
   
   
p0 = [0 0 0];                               %Startwertbedingung
p = lsqnonlin(@(p)minFunc(p,m),p0);         %lsqnonlin-Löser

figure(1);
plot(m.t,m.y,'+b');                         %Plot der Punktwolke
hold on;    
plot(m.t,fitFunc(m.t,p));                   %Plot der "best-fit-Funktion"
title('lsqnonlin-Löser')                    %Titel
legend('Data','Best fit')                  
xlabel('t')                                 %Achsenbeschriftung
ylabel('y')

a = p(1);                                   %Ausgabe der Parameter a,b &c
b = p(2);
c = p(3);
str1 = ['Parameter a = ' num2str(p(1))];
str2 = ['Parameter b = ' num2str(p(2))];
str3 = ['Parameter c = ' num2str(p(3))];
disp(str1)
disp(str2)
disp(str3)
end
%%
function y = fitFunc(t,p)                  
y = zeros(size(t));                         %Länge des Intervalls
for i = 1:length(t)
    y(i) = p(1)+p(2)*exp(-p(3)*t(i));       %zu untersuchende Funktion
end
end
%%
function J = minFunc(p,m)                  
J = sum((m.y-fitFunc(m.t,p)).^2);
end
 

Als Fehler bzw. Warnung wird mir dabei angezeigt:

Code:
%Warning: Trust-region-reflective algorithm requires at least as many equations as variables; using Levenberg-Marquardt algorithm
instead.
> In lsqncommon at 56
  In lsqnonlin at 237
  In lsqnonlin20 at 10

Solver stopped prematurely.

lsqnonlin stopped because it exceeded the function evaluation limit,
options.MaxFunEvals = 600 (the default value).

Parameter a = 3.8961
Parameter b = 3.8979
Parameter c = -0.021466
 


Gibt es die Möglichkeit die Anzahl an Iteration im lsqnonlin-Verfahren zu erhöhen oder habe ich einfach einen Fehler in der Programmierung was zu der Abweichung führt?

LG[/code]
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

da müsste doch auch ein Link zur Doku, der die Frage beantwortet, in der Meldung sein?

Code:
opts = optimoptions('lsqnonlin', 'MaxFunEvals', 6000);
p = lsqnonlin(@(p)minFunc(p,m),p0, [], [], opts);


Der Fit ist aber dennoch nicht gut. Das liegt daran, dass du lsqnonlin ungünstig verwendest: du summierst die quadrierten Abweichungen schon auf, der Sinn von lsqnonlin ist aber, dass du nur die quadrierten Abweichungen zurückgibst und der Solver das dann komponentenweise auf 0 bringt.
Wenn du das machst, konvergiert der Solver viel schneller und besser, und du brauchst die Optionen gar nicht mehr anzupassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Schwalla
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.07.16
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 20.01.2018, 20:20     Titel:
  Antworten mit Zitat      
Hallo,

Danke nochmals für deine Antwort Harald. Ich habe den Quellcode nochmals überarbeitet und komme nun zu einem schönen Ergebnis. Der Quellcode sieht dabei wie folgt aus:
Code:

%  -----------------------------------------------------------------------
%      Matlab-Löser "lsqnonlin" für nichtlineare Ausgleichsprobleme
%      n = 10 Messpunkte
%  -----------------------------------------------------------------------
clc                                             % Leeren des Command Window
clear all                                       % Leeren des Workspace
close all                                       % Schließung aller Fenster

% ------------------------------------------------------------------------
%                               Punktwolke
% ------------------------------------------------------------------------
t=[1 2 3 4 5 6 7 8 9 10];                       % t-Werte
y=[22 19 16 13.5 12 10 9 7.5 6.7 6.2];          % y-Werte

p0=[2,22,0.1];                                  % Startwerte Parameter
n = length(t);

for i=1:n                                       % Aufbau des Vektors in y
    yn(1,i)=y(1,i);
end
for i=1:n                                       % Aufbau des Vektors in t
    tn(1,i)=t(1,i);
end
%  -----------------------------------------------------------------------
%                         zu untersuchende Funktion
%  -----------------------------------------------------------------------
f = @(p)(p(1)+p(2)*exp(-p(3)*tn))-yn;          

% ------------------------------------------------------------------------
%           Definition von optinonalen Bedingungen & Kriterien
% ------------------------------------------------------------------------
options = optimoptions(@lsqnonlin,...           % Rückgriff Jakobimatrix
    'SpecifyObjectiveGradient',true);
options = optimoptions('lsqnonlin',...          % Darstellung Iterationen
    'Display','iter');
options.MaxFunctionEvaluations = 6000;          % max. Lösung der Funktion
options.MaxIterations = 1000;                   % max. Iterationslänge
[p]=lsqnonlin(f,p0,[],[],options)

%  -----------------------------------------------------------------------
%            Ausgabe der Parameter a,b&c hinsichtlich "best fit"
%  -----------------------------------------------------------------------
a = p(1);                                  
b = p(2);
c = p(3);
str1 = ['Parameter a = ' num2str(p(1))];
str2 = ['Parameter b = ' num2str(p(2))];
str3 = ['Parameter c = ' num2str(p(3))];
disp(str1)
disp(str2)
disp(str3)


%  -----------------------------------------------------------------------
%                Grafische Darstellung der Ergebnisse
%  -----------------------------------------------------------------------
figure(1);                                      
p = @(tn) p(1)+p(2)*exp(-p(3)*tn);              % parametrisierte Funktion
plot(tn,yn,'r*');                               % Plot der Punktwolke
hold on;                                        % weitere Darstellung
grid on;                                        % Gitternetz an
fplot(p,'k-');                                  % Plot der Funktion
title('lsqnonlin-method');                      % Überschrift
legend('data','best fit')                       % legende                                  
xlabel('t');                                    % x-Achsenbeschriftung
ylabel('y');                                    % y-Achsenbeschriftung
axis([0 11 0 25]);

 
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.