Main Content

Sistemas no lineales con restricciones

Resolver ecuaciones con restricciones de desigualdad

fsolve resuelve un sistema de ecuaciones no lineales. No obstante, no le permite incluir restricciones, ni siquiera límites de restricción. Así que, ¿cómo se puede resolver un sistema de ecuaciones no lineales cuando hay restricciones?

No se puede garantizar que exista una solución que cumpla sus restricciones. De hecho, es posible que el problema no tenga solución, ni siquiera una que no cumpla las restricciones. No obstante, existen técnicas para ayudarle a buscar soluciones que cumplan sus restricciones.

Para ilustrar las técnicas, considere cómo resolver las ecuaciones

F1(x)=(x1+1)(10-x1)1+x221+x22+x2F2(x)=(x2+2)(20-x2)1+x121+x12+x1,

donde los componentes de x deben ser no negativos. Las ecuaciones tienen cuatro soluciones:

x=(-1,-2)x=(10,-2)x=(-1,20)x=(10,20).

Solo una solución cumple las restricciones, en concreto x = (10,20).

La función auxiliar fbnd al final de este ejemplo calcula F(x) numéricamente.

Utilizar puntos de inicio diferentes

Por lo general, un sistema de N ecuaciones en N variables tiene soluciones aisladas, es decir, las soluciones no tienen vecinos cercanos que también sean soluciones. De este modo, una forma de buscar una solución que cumpla algunas restricciones consiste en generar un número de puntos iniciales x0 y, después, ejecutar fsolve comenzando en cada x0.

En este ejemplo, para buscar una solución al sistema de ecuaciones F(x)=0, tome 10 puntos aleatorios distribuidos normalmente con una media de 0 y una desviación estándar de 100.

rng default % For reproducibility
N = 10; % Try 10 random start points
pts = 100*randn(N,2); % Initial points are rows in pts
soln = zeros(N,2); % Allocate solution
opts = optimoptions('fsolve','Display','off');
for k = 1:N
    soln(k,:) = fsolve(@fbnd,pts(k,:),opts); % Find solutions
end

Enumere soluciones que cumplan las restricciones.

idx = soln(:,1) >= 0 & soln(:,2) >= 0;
disp(soln(idx,:))
   10.0000   20.0000
   10.0000   20.0000
   10.0000   20.0000
   10.0000   20.0000
   10.0000   20.0000

Utilice algoritmos diferentes

fsolve tiene tres algoritmos. Cada uno de ellos puede conducir a soluciones distintas.

En este ejemplo, tome x0 = [1,9] y examine la solución que devuelve cada algoritmo.

x0 = [1,9];
opts = optimoptions(@fsolve,'Display','off',...
    'Algorithm','trust-region-dogleg');
x1 = fsolve(@fbnd,x0,opts)
x1 = 1×2

   -1.0000   -2.0000

opts.Algorithm = 'trust-region';
x2 = fsolve(@fbnd,x0,opts)
x2 = 1×2

   -1.0000   20.0000

opts.Algorithm = 'levenberg-marquardt';
x3 = fsolve(@fbnd,x0,opts)
x3 = 1×2

    0.9523    8.9941

En este caso, todos los algoritmos encuentran diferentes soluciones para el mismo punto inicial. Ninguna cumple las restricciones. La "solución" x3 indicada ni siquiera es una solución, sino simplemente un punto estacionario localmente.

Utilizar lsqnonlin con límites

lsqnonlin intenta minimizar la suma de los cuadrados de los componentes de una función vectorial F(x). De este modo, trata de resolver la ecuación F(x) = 0. Asimismo, lsqnonlin acepta límites de restricción.

Formule el problema de ejemplo para lsqnonlin y resuélvalo.

lb = [0,0];
rng default
x0 = 100*randn(2,1);
[x,res] = lsqnonlin(@fbnd,x0,lb)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 2×1

   10.0000
   20.0000

res = 2.4783e-25

En este caso, lsqnonlin converge a la solución cumpliendo las restricciones. Puede utilizar lsqnonlin con el solver MultiStart de Global Optimization Toolbox para realizar la búsqueda en muchos puntos iniciales automáticamente. Consulte MultiStart Using lsqcurvefit or lsqnonlin (Global Optimization Toolbox).

Establecer ecuaciones y desigualdades como restricciones fmincon

Puede reformular el problema y utilizar fmincon de la siguiente forma:

  • Proporcione una función objetivo constante, como @(x)0, que se evalúa en 0 para cada x.

  • Establezca la función objetivo fsolve como las restricciones de igualdad no lineales en fmincon.

  • Proporcione cualquier otra restricción con la sintaxis fmincon habitual.

La función auxiliar fminconstr al final de este ejemplo implementa las restricciones no lineales. Resuelva el problema restringido.

lb = [0,0]; % Lower bound constraint
rng default % Reproducible initial point
x0 = 100*randn(2,1);
opts = optimoptions(@fmincon,'Algorithm','interior-point','Display','off');
x = fmincon(@(x)0,x0,[],[],[],[],lb,[],@fminconstr,opts)
x = 2×1

   10.0000
   20.0000

En este caso, fmincon resuelve el problema desde el punto de inicio.

Funciones auxiliares

Este código crea la función auxiliar fbnd.

function F = fbnd(x)

F(1) = (x(1)+1)*(10-x(1))*(1+x(2)^2)/(1+x(2)^2+x(2));
F(2) = (x(2)+2)*(20-x(2))*(1+x(1)^2)/(1+x(1)^2+x(1));
end

Este código crea la función auxiliar fminconstr.

function [c,ceq] = fminconstr(x)

c = []; % No nonlinear inequality
ceq = fbnd(x); % fsolve objective is fmincon nonlinear equality constraints
end

Consulte también

| |

Temas relacionados