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
solo tiene que crear variables de optimización con límites inferiores a 0. (Estas ecuaciones tienen cuatro soluciones: donde o y donde o ).
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 , 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.