Main Content

Sistema de ecuaciones no lineales con restricciones, basado en problemas

Este ejemplo muestra cómo intentar resolver un sistema de ecuaciones no lineales con restricciones mediante el enfoque basado en problemas.

Límites de restricción

Cuando su problema solo tiene restricciones de límite, el proceso para resolver el problema es sencillo. Por ejemplo, para encontrar la solución con componentes positivos al sistema de ecuaciones

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

solo tiene que crear variables de optimización con límites inferiores a 0. (Estas ecuaciones tienen cuatro soluciones: donde x1=-1 o x1=10 y donde x2=-2 o x2=20).

x = optimvar('x',2,"LowerBound",0);
expr1 = (x(1) + 1)*(10 - x(1))*((1 + x(2)^2))/(1 + x(2)^2 + x(2));
expr2 = (x(2) + 2)*(20 - x(2))*((1 + x(1)^2))/(1 + x(1)^2 + x(1));
eqn1 = expr1 == 0;
eqn2 = expr2 == 0;
prob = eqnproblem;
prob.Equations.eqn1 = eqn1;
prob.Equations.eqn2 = eqn2;
x0.x = [15,15];
[sol,fval,exitflag] = solve(prob,x0)
Equation problem has bound constraints. Reformulating as a least squares problem.

Solving problem using lsqnonlin.

Equation solved.

lsqnonlin completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
sol = struct with fields:
    x: [2x1 double]

fval = struct with fields:
    eqn1: 0
    eqn2: 0

exitflag = 
    EquationSolved

Visualice la solución.

sol.x
ans = 2×1

    10
    20

Restricciones generales

Cuando su problema tenga restricciones generales, formule el problema como un problema de optimización y no como un problema de ecuaciones. Establezca las ecuaciones como restricciones de igualdad. Por ejemplo, para resolver las ecuaciones precedentes sujetas a la restricción de desigualdad no lineal x210, elimine los límites en x y formule el problema como un problema de optimización sin función objetivo.

x.LowerBound = [];
circlecons = x(1)^2 + x(2)^2 <= 10;
prob2 = optimproblem;
prob2.Constraints.circlecons = circlecons;
prob2.Constraints.eqn1 = eqn1;
prob2.Constraints.eqn2 = eqn2;
[sol2,fval2,exitflag2] = solve(prob2,x0)
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
sol2 = struct with fields:
    x: [2x1 double]

fval2 = 0
exitflag2 = 
    OptimalSolution

Visualice la solución.

sol2.x
ans = 2×1

   -1.0000
   -2.0000

Restricciones generales utilizando el objetivo de mínimos cuadrados

También puede formular el problema estableciendo la función objetivo como una suma de cuadrados y las restricciones generales como una restricción. Esta formulación alternativa ofrece un problema matemáticamente equivalente, pero puede resultar en una solución diferente ya que la modificación en la formulación lleva al solver a diferentes iteraciones.

prob3 = optimproblem;
prob3.Objective = expr1^2 + expr2^2;
prob3.Constraints.circlecons = circlecons;
[sol3,fval3,exitflag3] = solve(prob3,x0)
Solving problem using lsqnonlin.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
sol3 = struct with fields:
    x: [2x1 double]

fval3 = 8.5058e-16
exitflag3 = 
    OptimalSolution

Visualice la solución.

sol3.x
ans = 2×1

   -1.0000
   -2.0000

En este caso, el objetivo de mínimos cuadrados lleva a la misma solución que la formulación previa, que solo usa restricciones.

Más información sobre la resolución de ecuaciones con restricciones

Generalmente, solve intenta resolver un sistema de ecuaciones no lineales minimizando la suma de cuadrados de los componentes de la ecuación. En otras palabras, si LHS(i) es la expresión al lado izquierdo de la ecuación i y RHS(i) es la expresión al lado derecho, entonces solve intenta minimizar sum((LHS RHS).^2).

En contraposición, al intentar satisfacer expresiones de restricciones no lineales, solve utiliza, de forma general, fmincon, e intenta satisfacer las restricciones utilizando estrategias diferentes.

En ambos casos, el solver puede fallar al intentar resolver las ecuaciones. Para obtener más información sobre estrategias que puede utilizar para intentar encontrar una solución cuando el solver falla, consulte fsolve no ha podido resolver la ecuación.

Consulte también

Temas relacionados