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

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

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

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

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

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

где компоненты x должны быть неотрицательными. Безусловно, существует четыре решения уравнений:

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

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

Чтобы решить уравнения численно, сначала введите код, чтобы вычислить F (x).

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));

Сохраните этот код как файл fbnd.m на вашем пути MATLAB®.

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

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

В данном примере, чтобы искать решение уравнения 1, возьмите 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

Исследуйте решения в soln, и вы находите несколько, которые удовлетворяют ограничения.

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

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

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

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

   -1.0000   -2.0000
opts.Algorithm = 'trust-region';
x2 = fsolve(@fbnd,x0,opts)
x2 =

   -1.0000   20.0000
opts.Algorithm = 'levenberg-marquardt';
x3 = fsolve(@fbnd,x0,opts)
x3 =

    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)
x =

   10.0000
   20.0000


res =

   2.4783e-25

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

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

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

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

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

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

В данном примере запишите файл функции для нелинейного ограничения неравенства.

function [c,ceq] = fminconstr(x)

c = []; % no nonlinear inequality
ceq = fbnd(x); % the fsolve objective is fmincon constraints

Сохраните этот код как файл fminconstr.m на вашем пути MATLAB.

Решите ограниченную проблему.

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 =

   10.0000
   20.0000

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

| |

Похожие темы