lsqnonlin

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

Описание

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

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

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

с необязательными нижними и верхними границами lb и 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 компоненты).

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

Найдите минимизацию точку и минимальное значение, начиная с точки 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

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

The '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-by- 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'.

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

CheckGradients

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

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

Диагностика

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

DiffMaxChange

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

DiffMinChange

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

Display

Level of 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

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

Для optimset, имя TolFun. См. «Текущие и устаревшие имена опций».

FunValCheck

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

MaxFunctionEvaluations

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

Для optimset, имя MaxFunEvals. См. «Текущие и устаревшие имена опций».

MaxIterations

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

Для optimset, имя MaxIter. См. «Текущие и устаревшие имена опций».

OptimalityTolerance

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

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

Для optimset, имя TolFun. См. «Текущие и устаревшие имена опций».

OutputFcn

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

PlotFcn

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

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

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

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

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

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

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

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

Для optimset, имя PlotFcns. См. «Текущие и устаревшие имена опций».

SpecifyObjectiveGradient

Если false (по умолчанию), решатель аппроксимирует якобиан, используя конечные различия. Если true, решатель использует определяемый пользователем якобиан (заданный в 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)/  <reservedrangesplaceholder0>  ≠ 0.

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

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

MaxPCGIter

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

PrecondBandWidth

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

SubproblemAlgorithm

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

TolPCG

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

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

Начальное значение параметра Левенберга-Марквардта, a положительной скалярной величины. По умолчанию это 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 меньше заданного допуска, или якобиан в 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 может решить сложные задачи непосредственно. Noe, что связанные ограничения не имеют смысла для комплексных чисел. Для комплексной задачи со связанными ограничениями разделите переменные на вещественные и мнимые части. Смотрите Подгонку модели к комплексно-оцененным данным.

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

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

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

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

Алгоритмы

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

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

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

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

Приложение

Задача Optimize Live Editor обеспечивает визуальный интерфейс для lsqnonlin.

Ссылки

[1] Коулман, Т. Ф. и Я. Ли. Подход внутренней доверительной области для нелинейной минимизации с учетом границ. SIAM Journal on Optimization, Vol. 6, 1996, pp. 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] Moré, J. J. «The Levenberg-Marquardt Algorithm: Implementation and Theory». Численный анализ, ред. Г. А. Ватсон, Лекции по математике 630, Springer Verlag, 1977, с. 105-116.

[7] Море, Дж. Дж., Б. С. Мусор и К. Э. Хилстром. Руководство пользователя для MINPACK 1. Argonne National Laboratory, Rept. ANL-80-74, 1980.

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

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

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