Этот пример показывает, как попытаться решить нелинейную систему уравнений с ограничениями с помощью основанного на проблеме подхода.
Когда ваша задача имеет только связанные ограничения, процесс решения задачи прост. Для примера найти решение с положительными компонентами в системе уравнений
просто создайте переменные оптимизации с нижними границами 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 = 8.0569e-16
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 Не Может Решить Уравнение.