Emplearía una formulación de programación lineal (LP) de la siguiente manera, suponiendo que [math] c [/ math] no sea negativa, de lo contrario, se puede utilizar el truco de diferencia de dos variables no negativas.
[matemáticas] \ begin {eqnarray} \ min_ {c, t} & \ mathbf {1} ^ T \ mathbf {t} \\\ text {st} & \ forall i \ in \ {1, \ ldots, n \ }, \\ & c \ cdot x_i – y_i \ leq t_i \\ & y_i-c \ cdot x_i \ leq t_i \ nonumber \ end {eqnarray} [/ math]
De hecho, uno de los sistemas de modelado y resolución establecidos, CVX, transforma automáticamente ambos problemas [$ \ ell_1, \ ell_ \ inf $] en LP.
- ¿Por qué el gráfico del área de presión no es lineal?
- ¿Cuál es el significado físico del producto triple vectorial?
- ¿Cómo determinamos si cierta cantidad física es un vector?
- ¿Serán los científicos de la computación y los programadores tan respetados como los matemáticos, físicos e ingenieros?
- ¿Debería hacer alemán B con HL de física y matemáticas para poder enfocarme mejor en física y matemáticas, o debería hacer un HL más desafiante?
Aquí hay un script MATLAB que compara lo anterior con la solución de CVX:
% obtener los vectores
n = 10;
x = rand (n, 1);
y = rand (n, 1);
% formula el problema de LP en MATLAB
[opt_sol, fval] = linprog ([0, ones (1, n)], [x, -eye (n, n); -x, -eye (n, n)], [y; -y]);
c_mat_lp = opt_sol (1);
% para comparación con CVX
% utilizando la expresión incorporada CVX
cvx_begin quiet
variable c (1)
minimizar (norma (c. * xy, 1))
cvx_end
% De formulación LP en CVX
cvx_begin quiet
clp variable
variable t (n)
minimizar suma (t)
sujeto a
clp. * x – y <= t
y – clp. * x <= t
cvx_end
disp ([‘Solucionador LP MATLAB: obj-val’ num2str (fval) ‘c-val’ num2str (c_mat_lp)])
disp ([‘CVX L1-norma solucionador: obj-val’ num2str (norma (c. * xy, 1)) ‘c-val’ num2str (c)])
disp ([formulación ‘CVX LP: obj-val’ num2str (norma (clp. * xy, 1)) ‘c-val’ num2str (clp)])