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
donde los componentes de deben ser no negativos. Las ecuaciones tienen cuatro soluciones:
Solo una solución cumple las restricciones, en concreto .
La función auxiliar fbnd
al final de este ejemplo calcula numéricamente.
Utilizar puntos de inicio diferentes
Por lo general, un sistema de ecuaciones en 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 , 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 . De este modo, trata de resolver la ecuación . 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 cadax
.Establezca la función objetivo
fsolve
como las restricciones de igualdad no lineales enfmincon
.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