1/ Comment définir mathématiquement le couple de la liste le plus "proche" de {A,B} ?
fatal_error a écrit:pour la 1:idem tu peux prendre le norme euclidienne : d({A,B}, {C,D}) = sqrt( (A-C)^2+(B-D)^2)
fatal_error a écrit:pour la 2 : tu peux t'en sortir avec programmation sous contrainte (linéaire si tu prends la distance avec les valeurs absolues)
pour tout tuple t de k elements possibles {x_i, y_i}
v: vecteur des coefficients (a_0..a_{k-1} de chacun des elements du tuple
C = a_0x_0+...+a_{k-1}x_{k-1}
D = a_0y_0+...+a_{k-1}y_{k-1}
minimiser d({C,B}, obj) //où obj est l'élément que tu veux approcher avec {C,D}
sous contrainte : 0<C<255, 0<D<255
C = a_0x_0+...+a_{k-1}x_{k-1} est bien une somme de produits de facteurs?
minimiser d({C,B}, obj) : tu veux dire minimiser d({C,D}?
Connaitrais-tu des exemples analogues à mes questions en AS ou en Java?
Donc il faut que j'étende mon problème :
de 2 éléments à 4 (dont 2 imposés) composés chacun d'un triplet au lieu d'un doublet.
Est-ce faisable d'après toi?
clear all;
clear global;
x_0=[0 0 0]';
A=[255,255,255];
B=[17,22,13];
C=[125,23,156];
global M = [A;B;C]';
global target=[64,200,32];
function obj = phi (x)
global M;
global target;
a=(x'*M-target);
obj=sqrt(a*a');
endfunction
lb=zeros(1,length(x_0));
ub=ones(1,length(x_0));
[x, obj, info, iter, nf, lambda] = sqp(x_0, { @phi }, [], [], lb',ub');
obj
x
x'*M
%output :
%{
obj = 194.73
x =
0.14850
0.17137
0.00000
ans =
81.5683 6.2947 22.5046
%}
%{
obj = 1.7837e-05
x =
103.169
-23.993
-78.925
ans =
64.000 200.000 32.000
%}
clear all;
clear global;
A=[255,255,255];
B=[17,22,13];
C=[125,23,156];
D=[0,0,0];
global M = [A;B;C;D];
global target=[64,200,32];
x_0=diag(zeros(length(M)))+0.5;
function obj = phi (x)
global M;
global target;
y=tanh(x);
x=y.*y;%trick: tabh->x in -1;1 then x*x ->x in 0<x<1
a=(M'*x/4-target');
obj=sumsq(a);
endfunction
[x, obj, info, iter, nf, lambda] = sqp(x_0, { @phi });
y=tanh(x);
x=y.*y;
obj
regTarget=(M'*x/4)
target
x
%
output:
regTarget =
68.000
69.250
67.000
target =
64 200 32
x =
1.0000e+00
1.0000e+00
6.9630e-17
2.1355e-01
%}
A=[255,40,0];
B=[0,255,0];
C=[0,0,128];
D=[0,0,0];
%{output
obj = 1.5939e+04
regTarget =
63.750
73.750
32.000
target =
64 200 32
x =
1.00000
1.00000
1.00000
0.21355
%}
s'il te faut a tout pris considérer (0,0,0) tu peux normaliser
E=1/4(aA+bB+cC+dD) (comme une moyenne) en rappelant que a,...,d sont inférieur à 1. ca imposera de prendre un a plus important et donc d existera
Trouver E en connaissant a, b, c, d et A, B, C, D n'est donc pas un problème. C'est la démarche inverse que je creuse toujours pour trouver la solution : trouver a, b, c, d en connaissant E et A, B, C, D!
clear all;
clear global;
A=[255,255,255];
B=[17,22,13];
C=[125,23,156];
D=[0,0,0];
global M = [A;B;C;D];
global target=[64,200,32];
x_0=diag(zeros(length(M)))+0.5;
function obj = phi (x)
global M;
global target;
y=tanh(x);
x=y.*y;%trick: tabh->x in -1;1 then x*x ->x in 0<x<1
a=(M'*x/4-target');
obj=sumsq(a);
endfunction
[x, obj, info, iter, nf, lambda] = sqp(x_0, { @phi });
y=tanh(x);
x=y.*y;
obj
regTarget=(M'*x/4)
target
x
%
output:
regTarget =
68.000
69.250
67.000
target =
64 200 32
x =
1.0000e+00
1.0000e+00
6.9630e-17
2.1355e-01
%}
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 16 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :