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: Fehlermeldung

 

thalia27
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 14.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2020, 21:10     Titel: lsqnonlin: Fehlermeldung
  Antworten mit Zitat      
Hallo zusammen,

ich habe folgende Funktion zu lösen

exp(-a*t) * sin (b*t+c)

Diese soll mit Hilfe der lsqnonlin Funktion gelöst werden.

Code:

t = [0.6000    1.2000    1.8000    2.4000    3.0000    3.6000    4.2000    4.8000    5.4000    6.0000    6.6000    7.2000    7.8000 8.4000    9.0000    9.6000]                      % t-Werte
y=[0.881 0.619 0.069 -0.312 -0.550 -0.463 -0.317 -0.123 0.072 0.227 0.196 0.170 0.079 -0.004 -0.079 -0.113];          % y-Werte

p0=[0.2,1,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
f = @(p)(exp (-p(1)*tn)* sin(p(2)*tn+p(3)))-yn;  

options = optimoptions(@lsqnonlin,...           % Rückgriff Jakobimatrix
    'Algorithm','levenberg-marquardt','SpecifyObjectiveGradient',true);
options = optimoptions('lsqnonlin',...          % Darstellung Iterationen
    'Display','iter');
options.MaxFunctionEvaluations = 8000;          % max. Lösung der Funktion
options.MaxIterations = 3000;                   % max. Iteration
[p]=lsqnonlin(f,p0,[],[],options)

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)

 


Es kam aber eine Fehlermeldung:

Code:
Error in Untitled>@(p)(exp(-p(1)*tn)*sin(p(2)*tn+p(3)))-yn (line 17)
f = @(p)(exp (-p(1)*tn)* sin(p(2)*tn+p(3)))-yn;

Error in lsqnonlin (line 206)
            initVals.F = feval(funfcn{3},xCurrent,varargin{:});

Error in Untitled (line 25)
[p]=lsqnonlin(f,p0,[],[],options)

Caused by:
    Failure in initial objective function evaluation. LSQNONLIN cannot continue.


Ich verstehe nicht, warum das jetzt nicht funktioniert. Kann mir jemand vielleicht helfen?

Viele Grüße, Very Happy
Thalia
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: 14.04.2020, 21:13     Titel:
  Antworten mit Zitat      
Hallo,

.* statt * in der Definition von f sollte helfen.

Deine ersten options überschreibst du übrigens mit den zweiten. Allerdings gibt deine Zielfunktion ohnehin nicht den Gradienten zurück...

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
 
thalia27
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 14.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2020, 22:09     Titel:
  Antworten mit Zitat      
Vielen Dank für die schnelle Antwort Very Happy

Ich habe nun überarbeitet.
Code:
clc                                             % Leeren des Command Window
clear all                                       % Leeren des Workspace
close all                                       % Schließung aller Fenster

t = [0.6000    1.2000    1.8000    2.4000    3.0000    3.6000    4.2000    4.8000    5.4000    6.0000    6.6000    7.2000    7.8000 8.4000    9.0000    9.6000]                      % t-Werte
y=[0.881 0.619 0.069 -0.312 -0.550 -0.463 -0.317 -0.123 0.072 0.227 0.196 0.170 0.079 -0.004 -0.079 -0.113];          % y-Werte

p0=[0.2,1,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
f = @(p)(exp (-p(1).*tn).* sin(p(2).*tn+p(3)))-yn;  
options = optimoptions(@lsqnonlin,'Algorithm','levenberg-marquardt');
[p] = lsqnonlin(f,p0,[],[],options);
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)
 


Es kam aber nun die Fehlermeldung Sad :

Code:
Attempt to execute SCRIPT lsqnonlin as a function:
C:\Users\blablabla
Error in lsqnonlin (line 19)
[p] = lsqnonlin(f,p0,[],[],options);
 


Ich kann den Fehler nicht geben. Könntest du mir vielleicht einen Tipp geben?

Viele Grüße,
Thalia
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: 14.04.2020, 22:17     Titel:
  Antworten mit Zitat      
Hallo,

hast du evtl. eine eigene Datei lsqnonlin genannt?
Code:

Falls ja: die eigene Datei umbenennen.

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
 
thalia27
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 14.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2020, 08:42     Titel:
  Antworten mit Zitat      
Ja..
jetzt funktioniert mein Programm auch. Danke schön Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
thalia27
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 14.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.04.2020, 13:26     Titel:
  Antworten mit Zitat      
Hallo,
ich möchte nun den Iterationsvorschritt grafisch darstellen, daher habe ich meinen Code bearbeitet.



Code:
clc                                             % Leeren des Command Window
clear all                                       % Leeren des Workspace
close all                                       % Schließung aller Fenster

t = [0.6000    1.2000    1.8000    2.4000    3.0000    3.6000    4.2000    4.8000    5.4000    6.0000    6.6000    7.2000    7.8000 8.4000    9.0000    9.6000]                      % t-Werte
y=[0.881 0.619 0.069 -0.312 -0.550 -0.463 -0.317 -0.123 0.072 0.227 0.196 0.170 0.079 -0.004 -0.079 -0.113];          % y-Werte

p0=[0.5,1,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
f = @(p)(exp (-p(1).*tn).* sin(p(2).*tn+p(3)))-yn;  
options = optimoptions(@lsqnonlin,'Algorithm','levenberg-marquardt','Display','iter-detailed','PlotFcns','optimplotfval');
[p] = lsqnonlin(f,p0,[],[],options);
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)


hold on
plot (tn,yn,'*r');
plot (tn, (exp (-p(1).*tn).* sin(p(2).*tn+p(3))),'k')

hold off
 


Ich habe eigentlich ertwartet, dass Matlab mir die Kurven für die 1. Iteration bis zu der letzten Iteration gibt.
Kann jemand mir sagen, was ich tun soll?

Viele Grüße,
Thalia
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: 17.04.2020, 13:42     Titel:
  Antworten mit Zitat      
Hallo,

wenn die vorgefertigten Funktionen nicht das machen, was du erwartest, eigene schreiben.

Zitat:
Custom plot functions use the same syntax as output functions. See Output Functions and Output Function Syntax.

https://www.mathworks.com/help/optim/ug/output-functions.html
https://www.mathworks.com/help/optim/ug/output-function.html

Bitte darauf achten, den Status des Threads aktuell zu halten. Bei "beantwortet" besteht die Gefahr, dass keiner mehr rein schaut, um weitere Fragen dazu zu beantworten.

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
 
thalia27
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 14.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.04.2020, 00:48     Titel:
  Antworten mit Zitat      
Hallo, vielen Dank für die Antwort.
Leider komme ich mit der Funktion nicht voran. Ich möchte nun erstmal die p-Werte von der 1. bis zur letzten Iteration haben, bevor ich sie in der Diagramm plotte.


Code:
clc                                             % Leeren des Command Window
clear all                                       % Leeren des Workspace
close all                                       % Schließung aller Fenster

t = [0.6000    1.2000    1.8000    2.4000    3.0000    3.6000    4.2000    4.8000    5.4000    6.0000    6.6000    7.2000    7.8000 8.4000    9.0000    9.6000];                      % t-Werte
y=[0.881 0.619 0.069 -0.312 -0.550 -0.463 -0.317 -0.123 0.072 0.227 0.196 0.170 0.079 -0.004 -0.079 -0.113];          % y-Werte

p0=[0.5,1,1];                                  % Startwerte Parameter
n = length(t);

f = @(p)(exp (-p(1).*t).* sin(p(2).*t+p(3)))-y;  
options = optimoptions(@lsqnonlin,'Display','iter','OutputFcn',@outfun);
[p] = lsqnonlin(f,p0,[],[],options);
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)
hold on
plot (t,y,'*r');
plot (t, (exp (-p(1).*t).* sin(p(2).*t+p(3))),'k')

hold off
 function stop = outfun(p,optimValues,state)
     stop = false;
 
     switch state
         case 'init'
             hold on
         case 'iter'
           history.fval = [history.fval; optimValues.fval];
           history.x = [history.x; p];
   
     
         case 'done'
             hold off
         otherwise
     end
 end

 


Es kam eine Fehlermeldung
Code:
Unrecognized function or variable 'history'.

Error in Matlab>outfun (line 36)
           history.fval = [history.fval; optimValues.fval];

Error in callAllOptimOutputFcns (line 13)
    stop(i) = feval(OutputFcn{i},xOutputfcn,optimValues,state,varargin{:});

Error in snls>callOutputAndPlotFcns (line 483)
            stop = callAllOptimOutputFcns(outputfcn,xOutputfcn,optimValues,state,varargin{:}) || stop;

Error in snls (line 261)
        [xOutputfcn,optimValues, stop] =
        callOutputAndPlotFcns(outputfcn,plotfcns,caller,x,xOutputfcn,'iter',iter, ...

Error in lsqncommon (line 164)
            snls(funfcn,xC,lb,ub,flags.verbosity,options,defaultopt,initVals.F,initVals.J,caller, ...

Error in lsqnonlin (line 253)
   lsqncommon(funfcn,xCurrent,lb,ub,options,defaultopt,allDefaultOpts,caller,...

Error in Matlab (line 13)
[p] = lsqnonlin(f,p0,[],[],options);
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: 18.04.2020, 10:15     Titel:
  Antworten mit Zitat      
Hallo,

die Initialisierung fehlt.
Code:
history.x = [];
history.fval = [];

Zudem muss outfun eine nested function sein. Du musst in dem Link halt noch ein bisschen nach unten scrollen, da steht das dann auch.

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.