Нелинейная система уравнений с ограничениями, основанная на проблеме

Этот пример показывает, как попытаться решить нелинейную систему уравнений с ограничениями с помощью основанного на проблеме подхода.

Ограниченные ограничения

Когда ваша задача имеет только связанные ограничения, процесс решения задачи прост. Для примера найти решение с положительными компонентами в системе уравнений

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

просто создайте переменные оптимизации с нижними границами 0. (Эти уравнения имеют четыре решения: где x1=-1 или x1=10, и где x2=-2 или 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

Просмотрите решение.

sol.x
ans = 2×1

    10
    20

Общие ограничения

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

См. также

Похожие темы