MATLAB.Exponenta
Рубрика Matlab&Toolboxes

Математика\Optimization Toolbox

А.Г.Трифонов. Примеры решения оптимизационных задач

  В оглавление книги \ К следующему разделу \ К предыдущему разделу

Пример нелинейных уравнений с аналитическим выражением для Якобиана.

В данном примере иллюстрируется применение принимаемого по умолчанию алгоритма средней размерности с командой fsolve. Исходная система уравнений является квадратной, т.е. число уравнений равно числу переменных.
Существует такое x , что

В данном примере используется команда fsolve для отыскания минимума банана функции (Розенброка) при помощи расчета производной и последующего решения соответствующей системы нелинейных уравнений. Функция Розенброка с минимумом в точке служит в качестве тестовой задачи в теории оптимизации. Эта функция имеет высокую степень нелинейности и сходится чрезвычайно медленно при использовании излишне грубых методов оптимизации. Функция определяется как

В начале обобщим эту функцию на случай n-ой размерности, когда при любом положительном четном значении n будет:

Эта функция называется обобщенной функцией Розенброка. Она состоит из n квадратичных членов с n неизвестными.

Перед использованием команды fsolve определим значения x , такие что , т.е. найдем минимум обобщенной функции Розенброка, для этого следует переписать функцию в виде следующей эквивалентной системы нелинейных уравнений.

Данная система уравнений является квадратичной и для решения возможно использование команды fsolve. Как следует из анализа примера, данная система имеет особое решение при xi=1, i=1,...,n .

Шаг 1. Составим М-файл bananaobj.m для расчета значений целевой функции Якобиана

function [F,J] = bananaobj(x);
% Расчет векторной функции и матрицы Якобиана для
% для системы нелинейных уравнений на базе
% n-мерной функции Розенброка.
% Получим задачу размера
n = length(x);  
if n == 0, error('Input vector, x, is empty.');
end
if mod(n,2) ~= 0, 
   error('Input vector, x, must have an even number of 
components.'); 
% входной вектор должен иметь четное число компонент
end
% Оценим векторную функцию
odds  = 1:2:n;
evens = 2:2:n;
F = zeros(n,1);
F(odds,1)  = 1-x(odds);
F(evens,1) = 10.*(x(evens)-x(odds).^2); 
% Расчет матрицы Якобиана если nargout > 1
if nargout > 1
   c = -ones(n/2,1);
   C = sparse(odds,odds,c,n,n);
   d = 10*ones(n/2,1);  
D = sparse(evens,evens,d,n,n);
   e = -20.*x(odds);
    E = sparse(evens,odds,e,n,n);
   J = C + D + E;
end

Шаг 2. Вызов подпрограммы для решения системы уравнений

n = 64;  
x0(1:n,1) = -1.9; 
x0(2:2:n,1) = 2;
options=optimset('Display','iter','Jacobian','on');
[x,F,exitflag,output,JAC] = fsolve(@bananaobj,x0,options);

Используем начальную точку x(i)=-1.9 для нечетных индексов и x(i)=2 для четных индексов. Выберем команду fsolve с принимаемой опцией 'off' для параметра крупномасштабного алгоритма и принимаемый по умолчанию алгоритм среднемасштабный с нелинейным уравнением 'dogleg'. Далее установим Якобиан как 'on' для того, что бы можно было использовать в bananaobj.m. Функция fsolve генерирует следующий результат:

Iteration Func-count f(x) Norm of step First-order optimality Trust-region radius
0 1 4281.92   615 1
1 2 1546.86 1 329 1
2 3 112.552 2.5 34.8 2.5
3 4 106.24 6.25 34.1 6.25
4 5 106.24 6.25 34.1 6.25
5 6 51.3854 1.5625 6.39 1.56
6 7 51.3854 3.90625 6.39 3.91
7 8 43.8722 0.976562 2.19 0.977
8 9 37.0713 2.44141 6.27 2.44
9 10 37.0713 2.44141 6.27 2.44
10 11 26.2485 0.610352 1.52 0.61
11 12 20.6649 1.52588 4.63 1.53
12 13 17.2558 1.52588 6.97 1.53
13 14 8.48582 1.52500 4.69 1.53
14 15 4.08398 1.52588 3.77 1.53
15 16 1.77589 1.52588 3.56 1.53
16 17 0.692381 1.52588 3.31 1.53
17 18 0.109777 1.16206 1.66 1.53
18 19 0 0.0468565 0 1.53

  В оглавление книги \ К следующему разделу \ К предыдущему разделу


Поиск по сайту:

Система Orphus

Яндекс.Метрика