Нелинейные системы с ограничениями

Решите уравнения по-разному ограничения

fsolve решает систему нелинейных уравнений. Однако это не позволяет вам включать любые ограничения, даже связанные ограничения. Таким образом, как можно решить систему нелинейных уравнений, когда у вас есть ограничения?

Решение, которое удовлетворяет вашим ограничениям, как гарантируют, не будет существовать. На самом деле проблема не может иметь никакого решения, даже то, которое не удовлетворяет вашим ограничениям. Однако методы существуют, чтобы помочь вам искать решения, которые удовлетворяют вашим ограничениям.

Чтобы проиллюстрировать методы, рассмотрите, как решить уравнения

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

где компоненты x mustBeNonnegative. Уравнения имеют четыре решения:

x=(-1,-2)x=(10,-2)x=(-1,20)x=(10,20).

Только одно решение удовлетворяет ограничениям, а именно, x = (10,20).

fbnd функция помощника в конце этого примера вычисляет F(x) численно.

Используйте различные стартовые точки

Обычно система N уравнения в N переменные изолировали решения, означая, что каждое решение не имеет никаких соседних соседей, которые являются также решениями. Так, один способ искать решение, которое удовлетворяет некоторым ограничениям, состоит в том, чтобы сгенерировать много точек начальной буквы x0, и затем запустите fsolve запуск в каждом x0.

В данном примере искать решение системы уравнения F(x)=0, возьмите 10 случайных точек, которые нормально распределены со средним значением 0 и стандартным отклонением 100.

rng default % For reproducibility
N = 10; % Try 10 random start points
pts = 100*randn(N,2); % Initial points are rows in pts
soln = zeros(N,2); % Allocate solution
opts = optimoptions('fsolve','Display','off');
for k = 1:N
    soln(k,:) = fsolve(@fbnd,pts(k,:),opts); % Find solutions
end

Перечислите решения, которые удовлетворяют ограничениям.

idx = soln(:,1) >= 0 & soln(:,2) >= 0;
disp(soln(idx,:))
   10.0000   20.0000
   10.0000   20.0000
   10.0000   20.0000
   10.0000   20.0000
   10.0000   20.0000

Используйте различные алгоритмы

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

В данном примере возьмите   x0 = [1,9] и исследуйте решение, которое возвращает каждый алгоритм.

x0 = [1,9];
opts = optimoptions(@fsolve,'Display','off',...
    'Algorithm','trust-region-dogleg');
x1 = fsolve(@fbnd,x0,opts)
x1 = 1×2

   -1.0000   -2.0000

opts.Algorithm = 'trust-region';
x2 = fsolve(@fbnd,x0,opts)
x2 = 1×2

   -1.0000   20.0000

opts.Algorithm = 'levenberg-marquardt';
x3 = fsolve(@fbnd,x0,opts)
x3 = 1×2

    0.9523    8.9941

Здесь, все три алгоритма находят различные решения для той же начальной точки. Ни один не удовлетворяет ограничениям. "Решение", о котором сообщают, x3 даже не решение, но просто локально стационарная точка.

Используйте lsqnonlin с Границами

lsqnonlin попытки минимизировать сумму квадратов компонентов в вектор-функции F(x). Поэтому это пытается решить уравнение F(x) = 0. Кроме того, lsqnonlin принимает связанные ограничения.

Сформулируйте проблему в качестве примера для lsqnonlin и решите его.

lb = [0,0];
rng default
x0 = 100*randn(2,1);
[x,res] = lsqnonlin(@fbnd,x0,lb)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 2×1

   10.0000
   20.0000

res = 2.4783e-25

В этом случае, lsqnonlin сходится к решению, удовлетворяющему ограничениям. Можно использовать lsqnonlin с MultiStart Global Optimization Toolbox решатель, чтобы искать по многой начальной букве указывает автоматически. Смотрите, что MultiStart Использует lsqcurvefit или lsqnonlin (Global Optimization Toolbox).

Установите уравнения и неравенства как fmincon Ограничения

Можно переформулировать проблему и использовать fmincon можно следующим образом:

  • Дайте постоянную целевую функцию, такую как @(x)0, который оценивает к 0 для каждого x.

  • Установите fsolve целевая функция как нелинейные ограничения равенства в fmincon.

  • Дайте любые другие ограничения в обычном fmincon синтаксис.

fminconstr функция помощника в конце этого примера реализует нелинейные ограничения. Решите ограниченную задачу.

lb = [0,0]; % Lower bound constraint
rng default % Reproducible initial point
x0 = 100*randn(2,1);
opts = optimoptions(@fmincon,'Algorithm','interior-point','Display','off');
x = fmincon(@(x)0,x0,[],[],[],[],lb,[],@fminconstr,opts)
x = 2×1

   10.0000
   20.0000

В этом случае, fmincon решает задачу от стартовой точки.

Функции помощника

Этот код создает fbnd функция помощника.

function F = fbnd(x)

F(1) = (x(1)+1)*(10-x(1))*(1+x(2)^2)/(1+x(2)^2+x(2));
F(2) = (x(2)+2)*(20-x(2))*(1+x(1)^2)/(1+x(1)^2+x(1));
end

Этот код создает fminconstr функция помощника.

function [c,ceq] = fminconstr(x)

c = []; % No nonlinear inequality
ceq = fbnd(x); % fsolve objective is fmincon nonlinear equality constraints
end

Смотрите также

| |

Похожие темы