Verfasst am: 02.05.2018, 23:03
Titel: function fmincon Fehler mit input data
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'.
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.
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.
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.
Ja, das stimmt wohl....
Warum habe ich das nicht gesehen
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, = cell2mat(CoeffArray(1,); %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
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
Einstellungen und Berechtigungen
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
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.