Нелинейные уравнения с аналитическим якобианом

Этот пример демонстрирует использование доверительного резкого искривления области по умолчанию fsolve алгоритм (см. Крупномасштабный по сравнению с Алгоритмами Средней шкалы). Это предназначается для проблем где

  • Система нелинейных уравнений является квадратной, т.е. количество уравнений равняется количеству неизвестных.

  • Там существует решение x, таким образом что F (x) = 0.

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

f(x)=100(x2x12)2+(1x1)2.

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

f(x)=i=1n/2100(x2ix2i12)2+(1x2i1)2.

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

Прежде чем можно будет использовать fsolve чтобы найти значения x таким образом что F (x) = 0, т.е. получить минимум обобщенной Функции Розенброка, необходимо переписать функцию как следующую эквивалентную систему нелинейных уравнений:

F(1)=1x1F(2)=10(x2x12)F(3)=1x3F(4)=10(x4x32)F(n1)=1xn1F(n)=10(xnxn12).

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

Шаг 1: Запишите файл bananaobj.m, чтобы вычислить значения целевой функции и якобиан.

function [F,J] = bananaobj(x)
% Evaluate the vector function and the Jacobian matrix for 
% the system of nonlinear equations derived from the general 
% n-dimensional Rosenbrock function.
% Get the problem size
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
% Evaluate the vector function
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); 
% Evaluate the Jacobian matrix if 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 = optimoptions(@fsolve,'Display','iter','SpecifyObjectiveGradient',true);
[x,F,exitflag,output,JAC] = fsolve(@bananaobj,x0,options);

Используйте начальную точку x (i) = –1.9 для нечетных индексов и x (i) = 2 для ровных индексов. Установите Display к 'iter' видеть прогресс решателя. Установите SpecifyObjectiveGradient к true использовать якобиан, заданный в bananaobj.m. fsolve функция генерирует следующий выход:

                                         Norm of      First-order   Trust-region
 Iteration  Func-count     f(x)          step         optimality    radius
     0          1         8563.84                           615               1
     1          2         3093.71              1            329               1
     2          3         225.104            2.5           34.8             2.5
     3          4          212.48           6.25           34.1            6.25
     4          5          212.48           6.25           34.1            6.25
     5          6          212.48         1.5625           34.1            1.56
     6          7         116.793       0.390625           5.79           0.391
     7          8         109.947       0.390625          0.753           0.391
     8          9         99.4696       0.976562            1.2           0.977
     9         10         83.6416        2.44141           7.13            2.44
    10         11         77.7663        2.44141           9.94            2.44
    11         12         77.7663        2.44141           9.94            2.44
    12         13          43.013       0.610352           1.38            0.61
    13         14         36.4334       0.610352           1.58            0.61
    14         15         34.1448        1.52588           6.71            1.53
    15         16         18.0108        1.52588           4.91            1.53
    16         17         8.48336        1.52588           3.74            1.53
    17         18         3.74566        1.52588           3.58            1.53
    18         19         1.46166        1.52588           3.32            1.53
    19         20         0.29997        1.24265           1.94            1.53
    20         21               0      0.0547695              0            1.53

Equation solved.

fsolve 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.

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

Похожие темы