Якобиан Матрица m n , образованная дифференцированием i-й компоненты f по переменной x j для получения i, j-го элемента называется якобианом f в точке х: Якобиан требует вычисления m n частных производных. Решение системы нелинейных уравнений с заданием Якобиана Рассмотрим постановку задачи нахождения решения системы нелинейных уравнений большой размерности и с заданием Якобианом. Размерность задачи в данном примере будет 1000. Цель заключается в том, что бы найти такое x, что F(x) = 0. Пусть n = 1000, а нелинейные уравнения будут: Для решения системы нелинейных уравнений (заметим, что якобиан данной системы функций является разреженной матрицей) используем функцию fsolve с применением алгоритма большой размерности Этап 1. Составим M-файл (под именем nlsfl.m) для вычисления значений целевых функций и якобиана: function [F.J] = nlsfl(x); % Вычисление векторной функции n = length(x); F = zeros(n,1); i = 2:(n-1); F(i) = (3-2*x(i)).*x(i)-x(i-1)-2*x(i+1)1+ 1; F(n) = (3-2*x(n)).*x(n)-x(n-1) + 1; F(1) = (3-2*x(1)).*x(1)-2*x(2) + 1; % Вычисление Якобиана d = -4*x + 3*ones(n,1); D = sparse(1:n,1:n,d,n,n); c = -2*ones(n-1,1); C = sparse(1:n-1,2:n,c,n,n); e = -ones(n-1,1); E = sparse(2:n,1:n-1,e,n,n); J = C + D + E; end sparse – означает, что задаваемая матрица будет разряженной, т.е. некоторые ее элементы равны нулю. Этап 2. Составление программы поиска решения: xstart = -ones(1000,1); % Вектор начальных значений fun = @nlsf1; % Имя целевой функции (М-файла) options = … optimset('Display','iter','LargeScale','on','Jacobian','on'); [x,fval,exitflag,output] = fsolve(fun,xstart,options); Начальная точка задается так же, как имя функции. Так как для команды fsolve по умолчанию принимается алгоритм средней размерности, то необходимо установить аргумент опции 'LargeScale' как 'on'. Установка параметра Якобина как 'on' принуждает команду fsolve использовать имеющуюся в nlsf1.m информацию о Якобиане. Результаты вычислений будут: Iteration Func-count Norm of First-order CG- step optimality Iterations f(x) 1 2 1011 1 19 0 2 3 16.1942 7.91898 2.35 3 3 4 0.0228027 1.3314 0.291 3 4 5 0.000103359 0.0433329 0.0201 4 5 6 7.3792e-007 0.0022606 0.000946 4 6 7 4.02299e-010 0.000268381 4.12e-005 5 Optimization terminated successfully: Relative function value changing by less than OPTIONS.TolFun Линейная система решается (конечно, с неким приближением) на каждой итерации при использовании метода сопряженных градиентов и предварительной обработки данных. Поскольку принимаемое по умолчанию значение опции PrecondBandWidth равно 0, то используется предварительная подготовка данных диагонального типа. (Опция PrecondBandWidth определяет ширину матрицы в операции предварительной подготовки данных. Ширина с размером 0 означает, что используется матрица только с одной диагональю.) Из значений оптимальности первого порядка следует быстрая линейная сходимость. Требуемое число итераций в методе сопряженных градиентов (CG) на одну основную итерацию является очень низким, самое большее пять итераций на задачу с размерностью 1000, что означает, что в нашем случае такие линейные системы не являются серьезным препятствием к решению (хотя для достижения прогресса в области сходимости требуются определенные дополнительные затраты). Градиент Пусть f (x) - функция от одной векторной переменной x x1 , x2 ,..., xn . Производная функции f в точке x есть вектор-строка Градиент f в точке х есть транспонирование f ' ( x) и будет обозначаться в виде f ( x) f ' ( x)T Гессиан Гессиан функции f (x) (матрица Гессе) обозначается как G (x ) и является матрицей n n элементов вида Gij ( x) 2 f . xi x j