В этом примере показано, как попытаться решить нелинейную систему уравнений с ограничениями при помощи подхода, основанного на проблеме.
Когда ваша проблема только связала ограничения, процесс для того, чтобы решить задачу является прямым. Например, чтобы найти решение с положительными компонентами к системе уравнений
просто создайте переменные оптимизации с нижними границами 0. (Эти уравнения имеют четыре решения: где или , и где или .)
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
Просмотрите решение.
sol.x
ans = 2×1
10
20
Когда ваша проблема будет иметь общие ограничения, сформулируйте проблему как задачу оптимизации, не проблему уравнения. Установите уравнения как ограничения равенства. Например, чтобы решить предыдущие уравнения подвергают нелинейному ограничению неравенства , удалите границы на x
и сформулируйте проблему как задачу оптимизации без целевой функции.
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
Просмотрите решение.
sol2.x
ans = 2×1
-1.0000
-2.0000
Можно также сформулировать проблему путем установки целевой функции как суммы квадратов и общих ограничений как ограничение. Эта альтернативная формулировка дает математически эквивалентную проблему, но может привести к различному решению, потому что изменение в формулировке приводит решатель к различным итерациям.
prob3 = optimproblem; prob3.Objective = expr1^2 + expr2^2; prob3.Constraints.circlecons = circlecons; [sol3,fval3,exitflag3] = solve(prob3,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.
sol3 = struct with fields:
x: [2x1 double]
fval3 = 4.8067e-13
exitflag3 = OptimalSolution
Просмотрите решение.
sol3.x
ans = 2×1
-1.0000
-2.0000
В этом случае цель наименьших квадратов приводит к тому же решению как предыдущая формулировка, которая использует только ограничения.
Обычно solve
попытки решить нелинейную систему уравнений путем минимизации суммы квадратов компонентов уравнения. Другими словами, если LHS(i)
выражение левой стороны для уравнения i
, и RHS(i)
выражение правой стороны, затем solve
попытки минимизировать sum((LHS
– RHS).^2)
.
В отличие от этого при попытке удовлетворить нелинейным ограничительным выражениям, solve
обычно использование fmincon
, и попытки удовлетворить ограничениям при помощи различных стратегий.
В обоих случаях решатель может не решить уравнения. Для стратегий можно использовать, чтобы попытаться найти решение, когда решатель перестал работать, см., что fsolve Не Мог Решить уравнение.