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

function fmincon Fehler mit input data

 

Freestyler
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 02.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2018, 22:03     Titel: function fmincon Fehler mit input data
  Antworten mit Zitat      
Hallo,

ich Rahmen einer Berechnung soll der Fehler "Errs" möglichst klein sein. Dabei sollen die 4 Variablen (Theta0, delta_Theta, Q und M) so gewählt werden, dass der Fehler "Errs" am kleinsten ist. Zuerst wurde dafür alle möglichlichen Varianten mithilfe von permn durchgerechnet und die Variante mit dem kleinsten Fehler gewählt. VecSize steht hierbei für die Auflösung (in diesem Fall 11 also 11^4 verschiedene Möglichkeiten). CA bedeutet Crank Angle und HRR Heat Release Rate. Theta0 (erster Wert von Guesses) ist der Start der Verbrennung, delta_Theta (zweiter Wert von Gueses) Verbrennungsdauer (beide in CA), Q ist die Wärmemenge und M ist der Schichtungsfaktor.
Nun habe ich Versucht das Programm mit der Funktion fmincon zu Optimieren. Leider erhalte ich immer wieder die selbe Fehlermeldung.

Error using fmincon (line 224)
FMINCON requires the following inputs to be of data type double: 'A'.

Error in wiebeFit (line 21)
[BestCoeffs, fval] = fmincon(@(CoeffArray) OBJ(CoeffArray,NumWiebes,CAs,HRR,CAparams,Guesses,Ranges,VecSize,EfficiencyFactor), [Guesses(:,1), Guesses(:,2), Guesses(:,3), Guesses(:,4)], options);


Ich habe euch den Programmcode und die gegeben Parameter angehängt. Wie Ihr sehen könnt haben alle Parameter den Typ double. Deshalb verstehe ich die Fehlermeldung nicht. Der Auskommentierte Teil im Code ist das alte Programm, mit dem die Berechnung funktioniert hat allerdings nur sehr langsam.

Ich hoffe Ihr könnt mir helfen.

Parameter.mat
 Beschreibung:

Download
 Dateiname:  Parameter.mat
 Dateigröße:  62.29 KB
 Heruntergeladen:  428 mal
wiebeFit.m
 Beschreibung:

Download
 Dateiname:  wiebeFit.m
 Dateigröße:  10.74 KB
 Heruntergeladen:  430 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.05.2018, 22:06     Titel:
  Antworten mit Zitat      
Hallo,

du verwendest fmincon falsch. options muss das 10. Eingabeargument von fmincon sein. Wenn du die vorherigen Argumente nicht nutzen willst, dann kannst du sie mit [] überspringen.
Wenn du keine Nebenbedingungen angeben willst, kannst du davon abgesehen auch gleich fminunc verwenden.

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 02.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2018, 22:59     Titel:
  Antworten mit Zitat      
Hallo,

vielen Dank erstmal für die schnelle Antwort. Sie haben recht, an dieser Stelle könnte ich auch fminunc wählen.
Jedoch erhalte ich wieder eine Fehlermeldung. Es ist immer die selbe, egal ob ich fminuc verwende oder fmincon mit [] erweitere.

Fehler:
Code:

Error using wiebeFit>OBJ
Too many input arguments.

Error in wiebeFit>@(CoeffArray)OBJ(CoeffArray,NumWiebes,CAs,HRR,CAparams,Guesses,Ranges,VecSize,EfficiencyFactor) (line 19)
    [BestCoeffs, fval] = fmincon(@(CoeffArray) OBJ(CoeffArray,NumWiebes,CAs,HRR,CAparams,Guesses,Ranges,VecSize,EfficiencyFactor),
    [Guesses(:,1), Guesses(:,2), Guesses(:,3), Guesses(:,4)], [], [], [], [], [], [], [], options);

Error in fmincon (line 546)
      initVals.f = feval(funfcn{3},X,varargin{:});

Error in wiebeFit (line 19)
    [BestCoeffs, fval] = fmincon(@(CoeffArray) OBJ(CoeffArray,NumWiebes,CAs,HRR,CAparams,Guesses,Ranges,VecSize,EfficiencyFactor),[Guesses(:,1), Guesses(:,2), Guesses(:,3), Guesses(:,4)], [], [], [], [], [], [], [], options);

Error in fitAppHRR_WiebeFcns (line 321)
    FitCoeffs(FunctionType,:) = wiebeFit(1.0,CA,NewHRR,...

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

Warum schreibt Matlab jetzt zu viele Eingabeparameter?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

weil deine Funktion OBJ 8 Inputs erwartet und du 9 übergibst.

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 02.05.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2018, 02:48     Titel:
  Antworten mit Zitat      
Ja, das stimmt wohl....
Warum habe ich das nicht gesehen Shocked

Ich habe den Code wie folgt korrigiert:

Code:
function [FitCoeffs,CAparams,Wiebe1s] = wiebeFit(NumWiebes,CAs,HRR,CAparams,Guesses,Ranges,VecSize,EfficiencyFactor)
    options = optimoptions('fmincon','FiniteDifferenceStepSize', 0.1);
    [BestCoeffs, fval] = fmincon(@(CoeffArray) OBJ(NumWiebes,CAs,HRR,CAparams,Guesses,Ranges,VecSize,EfficiencyFactor), [Guesses(:,1), Guesses(:,2), Guesses(:,3), Guesses(:,4)], [], [], [], [], [], [], [], options);
    % BestCoeffs(1,Smile = cell2mat(CoeffArray(1,Smile); %converts a cell array into an ordinary array (array in matrix)

    FitCoeffInds = fliplr(BestCoeffs); %returns BestCoeffs with its columns flipped in the left-right direction
    FitCoeffs = zeros(size(BestCoeffs));
    for WiebeNum = 1:NumWiebes
        for CoeffNum = 1:4
            FitCoeffs(WiebeNum,CoeffNum) = Coeffs(WiebeNum,CoeffNum,FitCoeffInds(WiebeNum,CoeffNum));
        end
    end
    [Err, Wiebels] = OBJ(NumWiebes,CAs,HRR,CAparams,Guesses,Ranges,VecSize,EfficiencyFactor);
end

function [Errs, Wiebels] = OBJ(NumWiebes,CAs,HRR,CAparams,Guesses,Ranges,VecSize,EfficiencyFactor)
    NewCAs = CAparams(1):CAparams(3):CAparams(2);
    NewHRR = zeros(1,length(NewCAs));


Allerdings erscheint jetzt der Fehler:

Error using fmincon (line 619)
Supplied objective function must return a scalar value.

Error in wiebeFit (line 19)
[BestCoeffs, fval] = fmincon(@(CoeffArray) OBJ(NumWiebes,CAs,HRR,CAparams,Guesses,Ranges,VecSize,EfficiencyFactor), [Guesses(:,1),
Guesses(:,2), Guesses(:,3), Guesses(:,4)], [], [], [], [], [], [], [], options);

Error in fitAppHRR_WiebeFcns (line 321)
FitCoeffs(FunctionType,Smile = wiebeFit(1.0,CA,NewHRR,...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

man muss eigentlich nur die Fehlermeldung lesen:
Zitat:
Supplied objective function must return a scalar value.


Deine Zielfunktion macht das wohl nicht. Falls du die Summe von Fehlerquadraten minimieren willst, kannst du norm(errs) zurückgeben. Alternativ einen least-squares-Solver, z.B. lsqnonlin, verwenden.

Grüße,
Harald
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.