fsolve
решает систему нелинейных уравнений. Однако это не позволяет вам включать любые ограничения, даже связанные ограничения. Таким образом, как можно решить систему нелинейных уравнений, когда у вас есть ограничения?
Решение, которое удовлетворяет вашим ограничениям, как гарантируют, не будет существовать. На самом деле проблема не может иметь никакого решения, даже то, которое не удовлетворяет вашим ограничениям. Однако методы существуют, чтобы помочь вам искать решения, которые удовлетворяют вашим ограничениям.
Чтобы проиллюстрировать методы, рассмотрите, как решить уравнения
(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
попытки минимизировать сумму квадратов компонентов в вектор-функции 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
можно следующим образом:
Дайте постоянную целевую функцию, такую как @(x)0
, который оценивает к 0
для каждого x
.
Установите fsolve
целевая функция как нелинейные ограничения равенства в fmincon
.
Дайте любые другие ограничения в обычном fmincon
синтаксис.
В данном примере запишите файл функции для нелинейных ограничений.
function [c,ceq] = fminconstr(x) c = []; % No nonlinear inequality ceq = fbnd(x); % fsolve objective is fmincon nonlinear equality 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