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

Fehler: Exiting due to infeasibility

 

charlie

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2008, 09:45     Titel: Fehler: Exiting due to infeasibility
  Antworten mit Zitat      
Hallo,

ich arbeite erst seit kurzem mit Matlab und habe somit leider sehr wenig Ahnung von der Materie.

Ich bekomme immer wieder diese Fehlermeldung und Matlab fittet nichts: Exiting due to infeasibility: 2 lower bounds exceed the corresponding upper bounds.


Das hier ist der Befehl zum fitten:

Code:

[x,resnorm,residual,exitflag,output,lamda,jacobian]=lsqcurvefit(@H2Okonz1,x0,tdata,ydata_H2O,lb,ub,options);
 


Das ist die gleichung H2Okonz1 die gefittet werden soll.
Code:

y(i)=(A10.*(exp(-(E10-alpha10.*th(i,5))/(R.*(T+273.15)))).*th(i,5)*g.*(exp(-h./(R.*(T+273.15)))).*th(i,4).*th(i,2)-A8.*(exp(-E8./(R.*(T+273.15)))).*th(i,5).*th(i,3))/(A9.*exp(-E9./(R.*(T+273.15))).*th(i,3));
 

Das th stammt aus einem Unterprogramm.

Ich weiß das sieht auf den ersten Blick so aus als müsste ich nur die bounds anders definieren, die stimmen aber, daran kann es also nicht liegen. Habe auch schon versucht durch ersetzen von lb und ub mit [] gar keine Grenzen zu setzen, die Meldung kommt aber trotzdem.

Wäre toll wenn mir da jemand weiterhelfen könnte.

Danke

/edit: Code-Umgebung ergänzt - Bitte zukünftig selbstständig formatieren!
Gruß Alex


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 20.08.2008, 10:44     Titel:
  Antworten mit Zitat      
Hallo charlie,

kannst Du vielleicht ein "lauffähiges", also ein fehlererzeugendes Beispiel posten? So ist eine Ferndiagnose schwierig.

Oder Du schaust mal selbst in die Funktionen lsqncommon und checkbounds. Im Debug-Modus kannst Du dort überprüfen, welche Werte übergeben werden, wenn Du lb und ub = [] setzt.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2008, 11:48     Titel:
  Antworten mit Zitat      
Hallo Bijick,

danke für die Antwort.

Also, das ist das erste Programm:
Code:

clc;
expdaten;
daten;
'H2SCR'

a=1.63e11;
b=17400;

x0=[a b];  
[x,resnorm,residual,exitflag,output,lamda,jacobian]=lsqcurvefit(@H2Okonz1,x0,ydata_H2O,tdata,[],[],options1);
       
    x;                                                                        
    resnorm;
    output;
    ci=nlparci(x,residual,jacobian);
    global r s th
    r=x(1);
    s=x(2);
 
    'Bedeckungsgrad'
    th

'Präexponentieller Faktor A7'
r
'Konfidenzintervall A7'
ci(1,:)
'Aktivierungsenergie E7'
s
'Konfidenzintervall E7'
ci(2,:)


Dieses ruft das erste Unterprogramm auf:

Code:
function y=H2Okonz1(x,tdata)
daten;
expdaten;
global  th g h
g=x(1);
h=x(2);
x0=[g h];
k=0;

for i=1:1:20;
    T=tdata(i);
   
[w,resnorm,res,exit]=lsqnonlin(@theta1,w0,x0,lb,ub,options);

q(i)=w(1);
u(i)=w(2);
v(i)=w(3);
o(i)=w(4);
p(i)=w(5);
w0=[q(i) u(i) v(i) o(i) p(i)];


k=k+1;
end
th(:,1)=q';
th(:,2)=u';
th(:,3)=v';
th(:,4)=o';
th(:,5)=p';

th=[q' u' v' o' p'];

for i=1:1:20
    T=tdata(i);  
 y(i)=(A10.*(exp(-(E10-alpha10.*th(i,5))/(R.*(T+273.15)))).*th(i,5)*g.*(exp(-h./(R.*(T+273.15)))).*th(i,4).*th(i,2)-A8.*(exp(-E8./(R.*(T+273.15)))).*th(i,5).*th(i,3))/(A9.*exp(-E9./(R.*(T+273.15))).*th(i,3));
end
end


Dieses wiederum das zweite:

Code:
function F=theta1(w)
daten;

global  T g h



%g=1.63e10;
%h=17400;
% w(1) = w (Sauerstoff)
% w(2) = w (Wasserstoff)
% w(3) = w (Frei)
% w(4) = w (Hydroxid)
% w(5) = w (Wasser)

%w=[w(1) w(2) w(3) w(4) w(5)];

cO2=(V.*((T+273.15)./298.15).*cO2ein+Aakt.*A4.*exp(-(E4-alpha4.*w(1))./(R.*(T+273.15))).*(w(1)^2))./((V.*((T+273.15)./298.15))+(Aakt.*A3.*exp(-E3./(R.*(T+273.15))).*((w(3))^2)));
cH2=(V.*((T+273.15)./298.15).*cH2ein+Aakt.*A2.*exp(-(E2-alpha2.*w(2))./(R.*(T+273.15))).*(w(2)^2))./(V.*((T+273.15)./298.15)+Aakt.*A1.*exp(-E1./(R.*(T+273.15))).*(w(3)^2));
cH2O=(Aakt.*A10.*exp(-(E10-alpha10.*w(5))./(R.*(T+273.15))).*w(5))./(V.*((T+273.15)./298.15)+Aakt.*A9.*exp(-E9./(R.*(T+273.15))).*w(3));

F(1)=-A4.*exp(-(E4-alpha4.*w(1)))./(R.*(T+273.15)).*(w(1)^2)+2.*A3.*exp(-E3./(R.*(T+273.15))).*cO2.*(w(3)^2)-A5.*exp(-E5./(R.*(T+273.15))).*w(2).*w(1)+A6*exp(-E6./(R.*(T+273.15))).*w(3).*w(4); %Belegung Sauerstoff
F(2)=-A2.*exp(-(E2-alpha2.*w(2))./(R.*(T+273.15))).*(w(2)^2)+2.*A1.*exp(-E1./(R.*(T+273.15))).*cH2.*(w(3)^2)-A5.*exp(-E5/(R.*(T+273.15))).*w(1).*w(2)+A6.*exp(-E6./(R.*(T+273.15))).*w(3).*w(4)-g.*exp(-h./(R.*(T+273.15))).*w(4).*w(2)+A8.*exp(-E8./(R.*(T+273.15))).*w(3).*w(5);%Belegung Wasserstoff
F(3)=1-w(1)-w(2)-w(3)-w(4)-w(5);
F(4)=A5.*exp(-E5./(R.*(T+273.15))).*w(1).*w(2)-A6.*exp(-E6./(R.*(T+273.15))).*w(4).*w(3)-g.*exp(-h./(R.*(T+273.15))).*w(2).*w(4)+A8.*exp(-E8./(R.*(T+273.15))).*w(3).*w(5); %Belegung Hydroxid%
F(5)=g*exp(-h./(R.*(T+273.15))).*w(4).*w(2)-A8.*exp(-E8./(R.*(T+273.15))).*w(5).*w(3)+A9.*exp(-E9./(R.*(T+273.15))).*cH2O.*w(3)-A10.*exp(-(E10-alpha10.*w(5))/(R.*(T+273.15))).*w(5);%Belegung Wasser  
end


Die options sind:

Code:
options=optimset('Largescale','off','TolX',10^-50,'TolFun',10^-50,'MaxFunEvals',10000,'MaxIter',50);
options1=optimset('Largescale','off','TolX',10^-50,'TolFun',10^-50,'MaxFunEvals',100,'MaxIter',50);



Wie kommt man in den debugging modus ? In der Matlab Hilfe und mit google findet man nur Informationen darüber wie man den Modus beendet.
Ich habe jetzt mal unter "Debug -> Stop if Error/Warning" das Ganze so eingestellt, dass Matlab beim ersten Fehler abbricht.
Als Ergebnis habe ich folgende Meldung erhalten:

Zitat:
Caught-error breakpoint was hit in optimget>optimgetfast at line 114. The error was:

Attempt to reference field of non-structure array.


Was das bedeuten soll habe ich bisher leider auch noch nicht herausgefunden, werde aber erstmal weiter danach suchen.
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 20.08.2008, 13:30     Titel:
  Antworten mit Zitat      
Hallo charlie,

    1. Jetzt bräuchte ich noch die daten und expdaten, damit lsqcurvefit überhaupt loslegt.

    2. Debugmodus:
    Ich schreibe in mein Haupt-m-file
    Code:

    Dann starte ich das Skript oder die Funktion mit F5 (oder Schaltfläche "save and run" im Editor).
    Wenn man die kritische Stelle kennt, kann man auch gezielt einen "Breakpoint" setzen indem man auf den "-" neben der entsprechenden Zeilennummer klickt. Dort erscheint dann ein roter Punkt (oder grau, bevor die Datei gespeichert wird).
    Der Vorteil ist dann: Es ist der Workspace der fehlererzeugenden Funktion geöffnet und man kann sich alle Variablen in ihrem dortigen Zustand anschauen. Mehr dazu in der Hilfe unter "Debugging Process and Features".

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2008, 13:54     Titel:
  Antworten mit Zitat      
daten.m:

Code:

A1=30.11;   %bei 50°C Präexponentieller Faktor
E1=0;                     %Aktivierungsenergie E1 [J/mol]
A2=5e10;  %[mol/sec*m^2]
E2=123000; %[J/mol]
alpha2=1000;%80000;%1.22;
A3=11.02;
E3=0;
E4=1.83e5;
A4=1.63e10;
alpha4=670;
A5=1.63e10;% [m^3/s*m²]
E5=0;
A6=2.54e10; %[mol/sec*m^2]
E6=74900;%[J/mol]
E8=73000;
A8=1.61e10;
E9=0;
A9=115.73;
A10=2.1e8;
E10=4300;
alpha10=0;
%g = 8.3*10^21;
%h=0.174*10^5;

w0=[0.20 0.70 0.00 0.00 0.00];%Bedeckungsgrad [/]


Aakt=0.914;        % [m^2]

R=8.3144;           %Gaskonstante [J/mol*K]
%b = 0.01666;         %Heizrate 1/min [K/s]
V=0.00000833;       %Volumenstrom [m3/s] 500ml/min
Tmin=30;             %Anfangstemperatur [°C]
sch=5;             %Schrittweite der Schleife [K]
Ta=145;           %Obere Grenze der Temperatur
cH2Oein= 0.0;
cH2ein= 0.0755; %in [mol/m³]2000ppm H2
cO2ein= 2.26; %[mol/m³] = 6 Vol%


options=optimset('Largescale','off','TolX',10^-50,'TolFun',10^-50,'MaxFunEvals',10000,'MaxIter',50); %TolX: max. Abweichung in x-Richtung; TolFun: Abweichung des Funktionswertes; MaxFunEvals: Max. Anzahl der Funktionsauswertungen; MaxIter: Max. Anzahl an Interationsschritten
options1=optimset('Largescale','off','TolX',10^-50,'TolFun',10^-50,'MaxFunEvals',100,'MaxIter',50); %TolX: max. Abweichung in x-Richtung; TolFun: Abweichung des Funktionswertes; MaxFunEvals: Max. Anzahl der Funktionsauswertungen; MaxIter: Max. Anzahl an Interationsschritten

lb1=[0 0];%[1.6e+9,1000]
ub1=[1.6e11 200000];%[1.6e+11, 200000]
lb=[0.00 0.00 0.00 0.00 0.00];           %untere Grenze
ub=[1.00 1.00 1.00 1.00 1.00];  


expdaten.m :

Code:

tdata=[125   120   115   110   105   100   95   90   85   80   75   70   65   60   55   50   45   40   35   30];
ydata_H2O=[0.088839286   0.088580357   0.088325893   0.088071429   0.087816964   0.0875625   0.087308036   0.08703125   0.085566964   0.083839286   0.08110119   0.077008929   0.070669643   0.057504252   0.037232143   0.0103125   0.005580357   0.002742347   0.0 0.0];


Nochmal vielen Dank für die Hilfe, ich werde das jetzt mal mit dem debugging probieren.

Güßle,

Charlie
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 20.08.2008, 14:55     Titel:
  Antworten mit Zitat      
hallo Charlie,

danke, jetzt kann ich es nachvollziehen.

Die Fehlermeldung liefert nicht das (äußere) lsqcurvefit, sondern das (innere) lsqnonlin.

Sie wird durch den fehlerhaften Aufruf
Code:
[w,resnorm,res,exit]=lsqnonlin(@theta1,w0,x0,lb,ub,options);

erzeugt, vergleiche:
Code:
x = lsqnonlin(fun,x0,lb,ub,options)

Das x0 bei Dir ist also zu viel.

Wenn ich das korrigiere, kommt allerdings die nächste Fehlermeldung. Sad Es stellt sich heraus, dass in der Funktion theta die Variable T nicht belegt ist, was dann zur Fehlermeldung führt:
??? In an assignment A(I) = B, the number of elements in B and
I must be the same.


Wenn ich T mit 1 belege, zeigt sich, dass die Koeffizientenmatrix für lsqnonlin schlecht konditioniert ist. Vielleicht ist das mit dem richtigen T besser, das musst Du mal ausprobieren.

Ansonsten ist es wohl immer problematisch, zwei Optimierungsverfahren ineinander zu schachteln, aber ich weiß auch, dass es manchmal nicht anders geht.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2008, 15:09     Titel:
  Antworten mit Zitat      
Danke, jetzt weiß ich wenigstes wo ich weitersuchen muss, hatte die Stelle eigentlich schon abgehakt. Das X0 hatte ich genau wegen dieser Matrixfehlermeldung drinnen. Werde jetzt mal an dem T rumbasteln.

Danke für die Hilfe

Grüßle,
Charlie
 
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.