Bonjour,
Je cherche à utiliser la fonction fmincon en utilisant une fonction anonyme pour les contraintes non linéaires mais je ne m'en sors pas. En fait ça marche si je créé une fonction dans un fichier séparé, mais pour des questions pratiques je souhaiterais quand même utiliser une fonction anonyme. Si vous avez des idées je suis preneur ! Merci d'avance.
Sans fonction anonyme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 clear all; close all; clc; x=fmincon(@(x) sum(1./x),0.5*ones(7,1),[],[],[],[],0.02*ones(7,1),0.8*ones(7,1),@confun,optimoptions(@fmincon,'Algorithm','interior-point')); disp(x);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 function [c, ceq] = confun(x) %UNTITLED9 Summary of this function goes here % Detailed explanation goes here Meq=dlmread('eq_test.txt'); cotes=dlmread('cotes_test.txt'); IT=(cotes(:,1)-cotes(:,2)).*sign(abs(cotes(:,2)... -cotes(:,1)))+(cotes(:,1)+cotes(:,2)).*~sign(abs(cotes(:,2)-cotes(:,1))); %Valeur des IT recentrés autour de Cmoy pour les cotes d'assemblage % Nonlinear inequality constraints c = sqrt(Meq*(x.^2))-IT; % Nonlinear equality constraints ceq = []; end
Et en gros ce que j'aimerai (en rouge la partie à modifier) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 clear all; close all; clc; Meq=dlmread('eq_test.txt'); cotes=dlmread('cotes_test.txt'); IT=(cotes(:,1)-cotes(:,2)).*sign(abs(cotes(:,2)... -cotes(:,1)))+(cotes(:,1)+cotes(:,2)).*~sign(abs(cotes(:,2)-cotes(:,1))); %Valeur des IT recentrés autour de Cmoy pour les cotes d'assemblage x=fmincon(@(x) sum(1./x),0.5*ones(7,1),[],[],[],[],0.02*ones(7,1),0.8*ones(7,1),@(x) [sqrt(Meq*(x.^2))-IT,[]],optimoptions(@fmincon,'Algorithm','interior-point')); disp(x);
Partager