exponenta event banner

lsqnonlin

Решение нелинейных задач наименьших квадратов (нелинейная подгонка данных)

Описание

Нелинейный решатель наименьших квадратов

Решает нелинейные задачи аппроксимации кривой наименьших квадратов формы

minx‖f (x) 22 = minx (f1 (x) 2 + f2 (x) 2 +... + fn (x) 2)

с необязательными нижней и верхней границами 1b и ub на компонентах x.

x, lb и ub могут быть векторами или матрицами; см. Аргументы матрицы.

Вместо вычисления значения f (x) ‖ 22 (сумма квадратов),lsqnonlin требуется определяемая пользователем функция для вычисления функции с векторными значениями

f (x) = [f1 (x) f2 (x) ⋮fn (x)].

пример

x = lsqnonlin(fun,x0) начинается в точке x0 и находит минимум суммы квадратов функций, описанных в fun. Функция fun возвращает вектор (или массив) значений, а не сумму квадратов значений. (Алгоритм неявно вычисляет сумму квадратов компонентов fun(x).)

Примечание

Передача дополнительных параметров объясняет, как передать дополнительные параметры векторной функции fun(x), при необходимости.

пример

x = lsqnonlin(fun,x0,lb,ub) определяет набор нижних и верхних границ для конструктивных переменных в x, чтобы решение всегда находилось в диапазоне lb  x  ub. Можно исправить компонент решения x(i) путем указания lb(i) = ub(i).

Примечание

Если указанные входные границы для проблемы противоречивы, вывод x является x0 и выходные данные resnorm и residual являются [].

Компоненты x0 которые нарушают границы lb ≤ x ≤ ub возвращаются к внутренней части поля, определяемой границами. Компоненты, соответствующие границам, не изменяются.

пример

x = lsqnonlin(fun,x0,lb,ub,options) минимизирует с помощью опций оптимизации, указанных в options. Использовать optimoptions для установки этих параметров. Передать пустые матрицы для lb и ub если не существует границ.

x = lsqnonlin(problem) находит минимальное значение для problem, структура, описанная в problem.

пример

[x,resnorm] = lsqnonlin(___), для любых входных аргументов возвращает значение возведенной в квадрат 2-нормы остатка при x: sum(fun(x).^2).

пример

[x,resnorm,residual,exitflag,output] = lsqnonlin(___) дополнительно возвращает значение остатка fun(x) на решении x, значение exitflag который описывает условие выхода и структуру output содержит информацию о процессе оптимизации.

[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(___) дополнительно возвращает структуру lambda чьи поля содержат множители Лагранжа в решении x, и якобианец из fun на решении x.

Примеры

свернуть все

Подгонка простой экспоненциальной кривой затухания к данным.

Создание данных из экспоненциальной модели затухания плюс шум. Модель:

y = exp (-1.3t) +

с t в диапазоне от 0 до 3, и λ нормально распределенный шум со средним значением 0 и стандартным отклонением 0,05.

rng default % for reproducibility
d = linspace(0,3);
y = exp(-1.3*d) + 0.05*randn(size(d));

Проблема в том, что, учитывая данные (d, y), найдите экспоненциальную скорость распада, которая лучше всего подходит для данных.

Создайте анонимную функцию, которая принимает значение экспоненциальной скорости r затухания и возвращает вектор разностей из модели с этой скоростью затухания и данными.

fun = @(r)exp(-d*r)-y;

Найдите значение оптимальной скорости распада. Произвольно выбрать начальное предположение x0 = 4.

x0 = 4;
x = lsqnonlin(fun,x0)
Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
x = 1.2645

Постройте график данных и наиболее подходящей экспоненциальной кривой.

plot(d,y,'ko',d,exp(-x*d),'b-')
legend('Data','Best fit')
xlabel('t')
ylabel('exp(-tx)')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Data, Best fit.

Найдите наиболее подходящую модель, если некоторые параметры фитинга имеют границы.

Найдите центрирующее b и масштабирующее a, которое наилучшим образом соответствует функции

aexp (-t) exp (-exp (- (t-b)))

к стандартной нормальной плотности,

12πexp (-t2/2).

Создание вектора t точек данных и соответствующей нормальной плотности в этих точках.

t = linspace(-4,4);
y = 1/sqrt(2*pi)*exp(-t.^2/2);

Создание функции, оценивающей разницу между центрированной и масштабированной функцией и нормалью y, с x(1) в качестве масштабирования a и x(2) в качестве центровки b.

fun = @(x)x(1)*exp(-t).*exp(-exp(-(t-x(2)))) - y;

Найти оптимальное решение, начиная с x0 = [1/2,0]с масштабированием a от 1/2 до 3/2 и центрированием b от -1 до 3.

lb = [1/2,-1];
ub = [3/2,3];
x0 = [1/2,0];
x = lsqnonlin(fun,x0,lb,ub)
Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
x = 1×2

    0.8231   -0.2444

Постройте график двух функций, чтобы увидеть качество посадки.

plot(t,y,'r-',t,fun(x)+y,'b-')
xlabel('t')
legend('Normal density','Fitted function')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Normal density, Fitted function.

Сравнение результатов проблемы подбора данных при использовании различных lsqnonlin алгоритмы.

Предположим, что у вас есть данные о времени наблюдения xdata и наблюдаемые данные ответа ydataи вы хотите найти параметры x (1) и x (2) для соответствия модели формы

ydata = x (1) exp (x (2) xdata).

Введите время наблюдения и ответы.

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

Создайте простую экспоненциальную модель затухания. Модель вычисляет вектор различий между прогнозируемыми и наблюдаемыми значениями.

fun = @(x)x(1)*exp(x(2)*xdata)-ydata;

Подгонка модели с использованием начальной точки x0 = [100,-1]. Сначала используйте значение по умолчанию 'trust-region-reflective' алгоритм.

x0 = [100,-1];
options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective');
x = lsqnonlin(fun,x0,[],[],options)
Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.
x = 1×2

  498.8309   -0.1013

Проверьте, есть ли какая-либо разница с помощью 'levenberg-marquardt алгоритм.

options.Algorithm = 'levenberg-marquardt';
x = lsqnonlin(fun,x0,[],[],options)
Local minimum possible.
lsqnonlin stopped because the relative size of the current step is less than
the value of the step size tolerance.
x = 1×2

  498.8309   -0.1013

Два алгоритма нашли одно и то же решение. Постройте график решения и данных.

plot(xdata,ydata,'ko')
hold on
tlist = linspace(xdata(1),xdata(end));
plot(tlist,x(1)*exp(x(2)*tlist),'b-')
xlabel xdata
ylabel ydata
title('Exponential Fit to Data')
legend('Data','Exponential Fit')
hold off

Figure contains an axes. The axes with title Exponential Fit to Data contains 2 objects of type line. These objects represent Data, Exponential Fit.

Найти x, который минимизирует

∑k=110 (2 + 2k-ekx1-ekx2) 2,

и найти значение минимальной суммы квадратов.

Поскольку lsqnonlin предполагает, что сумма квадратов явно не формируется в определяемой пользователем функции, функция передается lsqnonlin вместо этого следует вычислить векторнозначную функцию

Fk (x) = 2 + 2k-ekx1-ekx2,

для k = от 1 до 10 (то есть F должен иметь 10 компонентов).

myfun функция, которая вычисляет 10-компонентный вектор F, появляется в конце этого примера.

Найдите минимизирующую точку и минимальное значение, начиная с точки x0 = [0.3,0.4].

x0 = [0.3,0.4];
[x,resnorm] = lsqnonlin(@myfun,x0)
Local minimum possible.
lsqnonlin stopped because the size of the current step is less than
the value of the step size tolerance.
x = 1×2

    0.2578    0.2578

resnorm = 124.3622

resnorm вывод представляет собой квадрат остаточной нормы или сумму квадратов значений функции.

Следующая функция вычисляет целевую функцию с векторным значением.

function F = myfun(x)
k = 1:10;
F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));
end

Проверьте процесс решения по мере его возникновения (установив Display опция для 'iter') и после (проверив output структура).

Предположим, что у вас есть данные о времени наблюдения xdata и наблюдаемые данные ответа ydataи вы хотите найти параметры x (1) и x (2) для соответствия модели формы

ydata = x (1) exp (x (2) xdata).

Введите время наблюдения и ответы.

xdata = ...
 [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = ...
 [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];

Создайте простую экспоненциальную модель затухания. Модель вычисляет вектор различий между прогнозируемыми и наблюдаемыми значениями.

fun = @(x)x(1)*exp(x(2)*xdata)-ydata;

Подгонка модели с использованием начальной точки x0 = [100,-1]. Проверьте процесс решения, установив Display опция для 'iter'. Получить output для получения дополнительной информации о процессе решения.

x0 = [100,-1];
options = optimoptions('lsqnonlin','Display','iter');
[x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,[],[],options);
                                         Norm of      First-order 
 Iteration  Func-count     f(x)          step          optimality
     0          3          359677                      2.88e+04
Objective function returned Inf; trying a new point...
     1          6          359677        11.6976       2.88e+04      
     2          9          321395            0.5       4.97e+04      
     3         12          321395              1       4.97e+04      
     4         15          292253           0.25       7.06e+04      
     5         18          292253            0.5       7.06e+04      
     6         21          270350          0.125       1.15e+05      
     7         24          270350           0.25       1.15e+05      
     8         27          252777         0.0625       1.63e+05      
     9         30          252777          0.125       1.63e+05      
    10         33          243877        0.03125       7.48e+04      
    11         36          243660         0.0625        8.7e+04      
    12         39          243276         0.0625          2e+04      
    13         42          243174         0.0625       1.14e+04      
    14         45          242999          0.125        5.1e+03      
    15         48          242661           0.25       2.04e+03      
    16         51          241987            0.5       1.91e+03      
    17         54          240643              1       1.04e+03      
    18         57          237971              2       3.36e+03      
    19         60          232686              4       6.04e+03      
    20         63          222354              8        1.2e+04      
    21         66          202592             16       2.25e+04      
    22         69          166443             32       4.05e+04      
    23         72          106320             64       6.68e+04      
    24         75         28704.7            128       8.31e+04      
    25         78         89.7947        140.674       2.22e+04      
    26         81         9.57381        2.02599            684      
    27         84         9.50489      0.0619927           2.27      
    28         87         9.50489    0.000462261         0.0114      

Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

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

output
output = struct with fields:
    firstorderopt: 0.0114
       iterations: 28
        funcCount: 87
     cgiterations: 0
        algorithm: 'trust-region-reflective'
         stepsize: 4.6226e-04
          message: '...'

Для сравнения установите Algorithm опция для 'levenberg-marquardt'.

options.Algorithm = 'levenberg-marquardt';
[x,resnorm,residual,exitflag,output] = lsqnonlin(fun,x0,[],[],options);
                                        First-Order                    Norm of 
 Iteration  Func-count    Residual       optimality      Lambda           step
     0           3          359677        2.88e+04         0.01
Objective function returned Inf; trying a new point...
     1          13          340761        3.91e+04       100000       0.280777
     2          16          304661        5.97e+04        10000       0.373146
     3          21          297292        6.55e+04        1e+06      0.0589933
     4          24          288240        7.57e+04       100000      0.0645444
     5          28          275407        1.01e+05        1e+06      0.0741266
     6          31          249954        1.62e+05       100000       0.094571
     7          36          245896        1.35e+05        1e+07      0.0133606
     8          39          243846        7.26e+04        1e+06     0.00944311
     9          42          243568        5.66e+04       100000     0.00821622
    10          45          243424        1.61e+04        10000     0.00777936
    11          48          243322         8.8e+03         1000      0.0673933
    12          51          242408         5.1e+03          100       0.675209
    13          54          233628        1.05e+04           10        6.59804
    14          57          169089        8.51e+04            1        54.6992
    15          60         30814.7        1.54e+05          0.1        196.939
    16          63         147.496           8e+03         0.01        129.795
    17          66         9.51503             117        0.001        9.96069
    18          69         9.50489          0.0714       0.0001       0.080486
    19          72         9.50489        4.96e-05        1e-05    5.07028e-05

Local minimum possible.
lsqnonlin stopped because the relative size of the current step is less than
the value of the step size tolerance.

'levenberg-marquardt' сходились с меньшим количеством итераций, но почти столько же оценок функций:

output
output = struct with fields:
       iterations: 19
        funcCount: 72
         stepsize: 5.0703e-05
     cgiterations: []
    firstorderopt: 4.9629e-05
        algorithm: 'levenberg-marquardt'
          message: '...'

Входные аргументы

свернуть все

Функция, сумма квадратов которой минимизирована, заданная как дескриптор функции или имя функции. fun - функция, принимающая массив x и возвращает массив F, объективные функции, оцененные на x. Функция fun может быть указан как дескриптор функции для файла:

x = lsqnonlin(@myfun,x0)

где myfun является функцией MATLAB ®, такой как

function F = myfun(x)
F = ...            % Compute function values at x

fun также может быть дескриптором функции для анонимной функции.

x = lsqnonlin(@(x)sin(x.*x),x0);

Если пользовательские значения для x и F являются массивами, они преобразуются в векторы с помощью линейного индексирования (см. «Индексирование массивов»).

Примечание

Сумма квадратов не должна формироваться явно. Вместо этого функция должна возвращать вектор значений функции. См. Примеры.

Если якобиан также может быть вычислен и 'SpecifyObjectiveGradient' опция - true, устанавливается по

options = optimoptions('lsqnonlin','SpecifyObjectiveGradient',true)

затем функция fun должен возвращать второй выходной аргумент со значением якобиана J (матрица) на x. Путем проверки значения nargout, функция может избежать вычислений J когда fun вызывается только с одним выходным аргументом (в случае, когда алгоритму оптимизации требуется только значение F но не J).

function [F,J] = myfun(x)
F = ...          % Objective function values at x
if nargout > 1   % Two output arguments
   J = ...   % Jacobian of the function evaluated at x
end

Если fun возвращает массив m компоненты и x имеет n элементы, где n - количество элементов x0, якобианец J является mоколо-n матрица, где J(i,j) - частная производная F(i) в отношении x(j). (Якобиан J - транспонирование градиента F.)

Пример: @(x)cos(x).*exp(-x)

Типы данных: char | function_handle | string

Начальная точка, заданная как вещественный вектор или вещественный массив. Решатели используют количество элементов в x0 и размер x0 для определения количества и размера переменных, которые fun принимает.

Пример: x0 = [1,2,3,4]

Типы данных: double

Нижние границы, определяемые как вещественный вектор или вещественный массив. Если количество элементов в x0 равно количеству элементов в lb, то lb указывает, что

x(i) >= lb(i) для всех i.

Если numel(lb) < numel(x0), то lb указывает, что

x(i) >= lb(i) для 1 <= i <= numel(lb).

Если элементов в меньше lb чем в x0решатели выдают предупреждение.

Пример: Чтобы указать, что все компоненты x являются положительными, используйте lb = zeros(size(x0)).

Типы данных: double

Верхние границы, заданные как вещественный вектор или вещественный массив. Если количество элементов в x0 равно количеству элементов в ub, то ub указывает, что

x(i) <= ub(i) для всех i.

Если numel(ub) < numel(x0), то ub указывает, что

x(i) <= ub(i) для 1 <= i <= numel(ub).

Если элементов в меньше ub чем в x0решатели выдают предупреждение.

Пример: Чтобы указать, что все компоненты x меньше 1, используйте ub = ones(size(x0)).

Типы данных: double

Опции оптимизации, указанные как выходные данные optimoptions или структура как optimset возвращает.

Некоторые опции применимы ко всем алгоритмам, а другие актуальны для конкретных алгоритмов. Дополнительные сведения см. в разделе Справочник по опциям оптимизации.

Некоторые опции отсутствуют в optimoptions дисплей. Эти параметры выделены курсивом в следующей таблице. Дополнительные сведения см. в разделе Параметры просмотра.

Все алгоритмы

Algorithm

Выберите между 'trust-region-reflective' (по умолчанию) и 'levenberg-marquardt'.

Algorithm задает настройку для используемого алгоритма. Это только предпочтение, потому что для использования каждого алгоритма должны быть выполнены определенные условия. Для алгоритма, отражающего область доверия, нелинейная система уравнений не может быть недооценена; то есть количество уравнений (количество элементов F возвращено fun) должно быть не менее длины x. Дополнительные сведения о выборе алгоритма см. в разделе Выбор алгоритма.

CheckGradients

Сравнение предоставленных пользователем производных (градиентов цели или ограничений) с производными с конечной разницей. Варианты: false (по умолчанию) или true.

Для optimset, имя: DerivativeCheck и значения 'on' или 'off'. См. раздел Имена текущих и устаревших опций.

Диагностика

Отображение диагностической информации о функции, которая должна быть свернута или решена. Варианты: 'off' (по умолчанию) или 'on'.

DiffMaxChange

Максимальное изменение переменных для градиентов конечных разностей (положительный скаляр). Значение по умолчанию: Inf.

DiffMinChange

Минимальное изменение переменных для градиентов конечных разностей (положительный скаляр). Значение по умолчанию: 0.

Display

Уровень отображения (см. Итерационный просмотр):

  • 'off' или 'none' не отображает выходные данные.

  • 'iter' отображает выходные данные в каждой итерации и выдает сообщение о выходе по умолчанию.

  • 'iter-detailed' отображает выходные данные в каждой итерации и выдает сообщение о техническом выходе.

  • 'final' (по умолчанию) отображает только окончательный вывод и выдает сообщение о выходе по умолчанию.

  • 'final-detailed' отображает только окончательный вывод и выдает сообщение о техническом выходе.

FiniteDifferenceStepSize

Коэффициент размера шага скаляра или вектора для конечных разностей. При установке FiniteDifferenceStepSize к вектору v, прямые конечные различия delta являются

delta = v.*sign′(x).*max(abs(x),TypicalX);

где sign′(x) = sign(x) кроме sign′(0) = 1. Центральными конечными различиями являются

delta = v.*max(abs(x),TypicalX);

Скаляр FiniteDifferenceStepSize расширяется до вектора. Значение по умолчанию: sqrt(eps) для прямых конечных разностей, и eps^(1/3) для центральных конечных разностей.

Для optimset, имя: FinDiffRelStep. См. раздел Имена текущих и устаревших опций.

FiniteDifferenceType

Конечные различия, используемые для оценки градиентов: 'forward' (по умолчанию), или 'central' (по центру). 'central' занимает вдвое больше оценок функций, но должно быть более точным.

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

Для optimset, имя: FinDiffType. См. раздел Имена текущих и устаревших опций.

FunctionTolerance

Допуск окончания для значения функции, положительный скаляр. Значение по умолчанию: 1e-6. См. раздел Допуски и критерии остановки.

Для optimset, имя: TolFun. См. раздел Имена текущих и устаревших опций.

FunValCheck

Проверьте допустимость значений функций. 'on' отображает ошибку, когда функция возвращает значение, complex, Inf, или NaN. Дефолт 'off' не отображает ошибки.

MaxFunctionEvaluations

Максимально допустимое число оценок функций, положительное целое число. Значение по умолчанию: 100*numberOfVariables. См. раздел Допуски и критерии остановки, итерации и подсчеты функций.

Для optimset, имя: MaxFunEvals. См. раздел Имена текущих и устаревших опций.

MaxIterations

Максимально допустимое число итераций, положительное целое число. Значение по умолчанию: 400. См. раздел Допуски и критерии остановки, итерации и подсчеты функций.

Для optimset, имя: MaxIter. См. раздел Имена текущих и устаревших опций.

OptimalityTolerance

Допуск окончания для оптимальности первого порядка (положительный скаляр). Значение по умолчанию: 1e-6. См. раздел Измерение оптимальности первого порядка.

Внутри, 'levenberg-marquardt' алгоритм использует допуск оптимальности (критерий остановки) 1e-4 времена FunctionTolerance и не использует OptimalityTolerance.

Для optimset, имя: TolFun. См. раздел Имена текущих и устаревших опций.

OutputFcn

Укажите одну или несколько пользовательских функций, вызываемых функцией оптимизации в каждой итерации. Передача дескриптора функции или массива ячеек дескрипторов функции. Значение по умолчанию - нет ([]). См. раздел Функция вывода и синтаксис функции печати.

PlotFcn

Отображает различные показатели прогресса во время выполнения алгоритма; выбрать из предопределенных графиков или написать свой собственный. Передача имени, дескриптора функции или массива ячеек имен или дескрипторов функций. Для пользовательских функций печати передайте дескрипторы функций. Значение по умолчанию - нет ([]):

  • 'optimplotx' строит график текущей точки.

  • 'optimplotfunccount' строит график подсчета функций.

  • 'optimplotfval' строит график значения функции.

  • 'optimplotresnorm' строит график нормы остатков.

  • 'optimplotstepsize' строит график размера шага.

  • 'optimplotfirstorderopt' строит график измерения оптимальности первого порядка.

Пользовательские функции печати используют тот же синтаксис, что и функции вывода. См. раздел Функции вывода для оптимизации Toolbox™ и Функция вывода и синтаксис функции печати.

Для optimset, имя: PlotFcns. См. раздел Имена текущих и устаревших опций.

SpecifyObjectiveGradient

Если false (по умолчанию) решатель аппроксимирует якобиан с помощью конечных разностей. Если true, решатель использует определяемый пользователем Jacobian (определяется в fun), или якобинская информация (при использовании JacobMult), для целевой функции.

Для optimset, имя: Jacobian, и значения 'on' или 'off'. См. раздел Имена текущих и устаревших опций.

StepTolerance

Допуск окончания на x, положительный скаляр. Значение по умолчанию: 1e-6. См. раздел Допуски и критерии остановки.

Для optimset, имя: TolX. См. раздел Имена текущих и устаревших опций.

TypicalX

Типичный x значения. Количество элементов в TypicalX равно количеству элементов в x0, отправная точка. Значение по умолчанию: ones(numberofvariables,1). Решатель использует TypicalX для масштабирования конечных разностей для градиентной оценки.

UseParallel

Когда true, решатель оценивает градиенты параллельно. Отключите, установив значение по умолчанию, false. См. раздел Параллельные вычисления.

Алгоритм, отражающий область доверия
JacobianMultiplyFcn

Функция умножения якобиана, заданная как дескриптор функции. Для крупномасштабных структурированных задач эта функция вычисляет матричное изделие Якобиана J*Y, J'*Y, или J'*(J*Y) без фактического формирования J. Функция имеет вид

W = jmfun(Jinfo,Y,flag) 

где Jinfo содержит матрицу, используемую для вычисления J*Y (или J'*Y, или J'*(J*Y)). Первый аргумент Jinfo должен совпадать со вторым аргументом, возвращаемым целевой функцией fun, например, по

[F,Jinfo] = fun(x)

Y - матрица, имеющая такое же количество строк, как и размеры в задаче. flag определяет, какой продукт вычислять:

  • Если flag == 0 тогда W = J'*(J*Y).

  • Если flag > 0 тогда W = J*Y.

  • Если flag < 0 тогда W = J'*Y.

В каждом случае J не формируется явным образом. Решатель использует Jinfo для вычисления предварительного условия. Для получения информации о подаче значений для любых дополнительных параметров см. раздел Передача дополнительных параметров. jmfun потребности.

Примечание

'SpecifyObjectiveGradient' необходимо установить значение true для прохождения решателя Jinfo от fun кому jmfun.

Аналогичные примеры см. в разделе Минимизация с помощью плотных структурированных гессенских, линейных уравнений и функции умножения якобиана с линейными наименьшими квадратами.

Для optimset, имя: JacobMult. См. раздел Имена текущих и устаревших опций.

JacobPattern

Узор разреженности якобиана для конечных разностей. Набор JacobPattern(i,j) = 1 когда fun(i) зависит от x(j). В противном случае установите JacobPattern(i,j) = 0. Другими словами, JacobPattern(i,j) = 1 когда вы можете иметь ∂fun(i)/∂x(j)  ≠ 0.

Использовать JacobPattern когда неудобно вычислять матрицу Якобиана J в fun, хотя вы можете определить (скажем, инспекцией), когда fun(i) зависит от x(j). Решатель может аппроксимировать J посредством разреженных конечных разностей, когда вы даете JacobPattern.

Если структура неизвестна, не устанавливайте JacobPattern. Поведение по умолчанию: JacobPattern - плотная матрица из них. Затем решатель вычисляет полную аппроксимацию конечных разностей в каждой итерации. Это может быть дорого для больших проблем, поэтому обычно лучше определить структуру разреженности.

MaxPCGIter

Максимальное число итераций PCG (предварительно кондиционированный сопряженный градиент), положительный скаляр. Значение по умолчанию: max(1,numberOfVariables/2). Дополнительные сведения см. в разделе Масштабные нелинейные наименьшие квадраты.

PrecondBandWidth

Верхняя полоса пропускания устройства предварительного кондиционирования для PCG, неотрицательное целое число. Дефолт PrecondBandWidth является Inf, что означает использование прямой факторизации (Cholesky), а не сопряженных градиентов (CG). Прямая факторизация в вычислительном отношении дороже, чем CG, но обеспечивает более качественный шаг к решению. Набор PrecondBandWidth кому 0 для предварительного кондиционирования по диагонали (верхняя полоса пропускания 0). Для некоторых проблем промежуточная полоса пропускания уменьшает количество итераций PCG.

SubproblemAlgorithm

Определяет способ вычисления шага итерации. Значение по умолчанию, 'factorization', делает более медленный, но более точный шаг, чем 'cg'. См. Доверие - Область - Отражающие наименьшие квадраты.

TolPCG

Допуск окончания для итерации PCG, положительный скаляр. Значение по умолчанию: 0.1.

Алгоритм Левенберга-Марквардта
InitDamping

Начальное значение параметра Левенберга-Марквардта, положительный скаляр. По умолчанию: 1e-2. Дополнительные сведения см. в разделе Метод Левенберга-Марквардта.

ScaleProblem

'jacobian' иногда может улучшить сходимость плохо масштабированной проблемы; значение по умолчанию - 'none'.

Пример: options = optimoptions('lsqnonlin','FiniteDifferenceType','central')

Структура проблемы, заданная как структура со следующими полями:

Имя поляВход

objective

Целевая функция

x0

Начальная точка для x
lbВектор нижних границ
ubВектор верхних границ

solver

'lsqnonlin'

options

Параметры, созданные с помощью optimoptions

Вы должны предоставить, по крайней мере, objective, x0, solver, и options поля в problem структура.

Типы данных: struct

Выходные аргументы

свернуть все

Решение, возвращаемое в виде вещественного вектора или вещественного массива. Размер x совпадает с размером x0. Как правило, x является локальным решением проблемы, когда exitflag является положительным. Сведения о качестве решения см. в разделе Когда решатель добьется успеха.

Возведенная в квадрат норма остатка, возвращаемая как неотрицательный вещественный. resnorm - квадрат 2-нормы остатка при x: sum(fun(x).^2).

Значение целевой функции в решении, возвращаемое в виде массива. В общем, residual = fun(x).

Причина остановки решателя, возвращаемого в виде целого числа.

1

Функция, сходящаяся к решению x.

2

Изменение в x меньше указанного допуска или Jacobian при x не определен.

3

Изменение остатка меньше указанного допуска.

4

Относительная величина направления поиска меньше допуска шага.

0

Число итераций превышает options.MaxIterations или количество превышенных оценок функций options.MaxFunctionEvaluations.

-1

Функция печати или функция вывода остановила решатель.

-2

Проблема неосуществима: границы lb и ub несовместимы.

Информация о процессе оптимизации, возвращенная в виде структуры с полями:

firstorderopt

Мера оптимальности первого порядка

iterations

Количество выполненных итераций

funcCount

Количество аналитических отчетов по функциям

cgiterations

Общее число итераций PCG (только алгоритм, отражающий область доверия)

stepsize

Окончательное смещение в x

algorithm

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

message

Выйти из сообщения

Множители лагранжа в решении, возвращаемые как структура с полями:

lower

Нижние границы lb

upper

Верхние границы ub

Якобиан в решении, вернулся как реальная матрица. jacobian(i,j) - частная производная fun(i) в отношении x(j) на решении x.

Ограничения

  • Алгоритм, отражающий область доверия, не решает неопределенные системы; он требует, чтобы число уравнений, то есть размерность строки F, было по меньшей мере таким же большим, как число переменных. В случае с неопределенностью, lsqnonlin использует алгоритм Левенберга - Марквардта.

  • lsqnonlin может решать сложные задачи напрямую. Нет, что связанные ограничения не имеют смысла для сложных значений. Для сложной проблемы с ограничивающими ограничениями разбейте переменные на вещественные и мнимые части. См. раздел Подгонка модели к данным со сложным значением.

  • Вычисление устройства предварительного кондиционирования, используемое в предварительно кондиционированной сопряженной градиентной части метода отражения области доверия, формирует JTJ (где J - матрица Якобиана) перед вычислением устройства предварительного кондиционирования. Поэтому ряд J со многими ненулевыми значениями, что приводит к получению почти плотного продукта JTJ, может привести к дорогостоящему процессу решения больших проблем.

  • Если компоненты x не имеют верхних (или нижних) границ, lsqnonlin предпочитает, чтобы соответствующие компоненты ub (или lb) иметь значение inf (или -inf для нижних границ) в отличие от произвольного, но очень большого положительного (или отрицательного для нижних границ) числа.

Алгоритм отражения области доверия можно использовать в lsqnonlin, lsqcurvefit, и fsolve с малыми и средними проблемами без вычисления Jacobian в fun или предоставление якобианской модели разреженности. (Это также относится к использованию fmincon или fminunc без вычисления гессенского или предоставления гессенского шаблона разреженности.) Насколько малыми являются малые и средние размеры? Абсолютный ответ недоступен, так как зависит от объема виртуальной памяти в конфигурации компьютера.

Предположим, что у вашей проблемы m уравнения и n неизвестные. Если команда J = sparse(ones(m,n)) вызывает Out of memory ошибка на вашем компьютере, то это, безусловно, слишком большая проблема. Если это не приведет к ошибке, проблема может быть слишком большой. Вы можете узнать, только запустив его и увидев, работает ли MATLAB в пределах объема виртуальной памяти, доступной в вашей системе.

Алгоритмы

Методы Левенберга-Марквардта и отражения области доверия основаны на нелинейных алгоритмах наименьших квадратов, также используемых в fsolve.

  • Алгоритм отражения области доверия по умолчанию является методом области доверия подпространства и основан на способе Ньютона с внутренним отражением, описанном в [1] и [2]. Каждая итерация включает в себя приблизительное решение большой линейной системы методом предварительно кондиционированных сопряженных градиентов (PCG). См. Доверие - Область - Отражающие наименьшие квадраты.

  • Метод Левенберга-Марквардта описан в ссылках [4], [5] и [6]. См. Метод Левенберга-Марквардта.

Альтернативная функциональность

Приложение

Задача «Оптимизировать интерактивный редактор» обеспечивает визуальный интерфейс для lsqnonlin.

Ссылки

[1] Коулман, Т. Ф. и Я. Ли. «Подход» Внутренняя область, область доверия «для нелинейной минимизации с учетом ограничений». Журнал СИАМ по оптимизации, том 6, 1996, стр. 418-445.

[2] Коулман, Т. Ф. и Я. Ли. «О сходимости отражающих методов Ньютона для масштабной нелинейной минимизации, зависящей от границ». Математическое программирование, том 67, номер 2, 1994, стр. 189-224.

[3] Деннис, Дж. Э. младший «Нелинейные наименьшие квадраты». Состояние искусства в численном анализе, ред. Д. Джейкобс, Академическая пресса, стр. 269-312.

[4] Левенберг, К. «Метод решения некоторых проблем в наименьших квадратах». Ежеквартальная прикладная математика 2, 1944, с. 164-168.

[5] Марквардт, Д. «Алгоритм оценки нелинейных параметров методом наименьших квадратов». SIAM Journal Applied Mathematics, Vol. 11, 1963, pp. 431-441.

[6] Море, Дж. Дж. «Алгоритм Левенберга-Марквардта: реализация и теория». Численный анализ, ред. Г. А. Уотсон, лекционные записки по математике 630, Springer Verlag, 1977, с. 105-116.

[7] Море, Дж. Дж., Б. С. Гарбоу и К. Э. Хиллстрем. Руководство пользователя для MINPACK 1. Аргоннская национальная лаборатория, Репт. ANL-80-74, 1980.

[8] Пауэлл, М. Дж. Д. «Подпрограмма Фортрана для решения систем нелинейных алгебраических уравнений». Численные методы нелинейных алгебраических уравнений, П. Рабиновиц, изд., Ch.7, 1970.

Расширенные возможности

.
Представлен до R2006a