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)
x = lsqnonlin(fun,x0,lb,ub)
x = lsqnonlin(fun,x0,lb,ub,options)
x = lsqnonlin(problem)
[x,resnorm] = lsqnonlin(___)
[x,resnorm,residual,exitflag,output] = lsqnonlin(___)
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(___)

Описание

пример

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 является структурой, описанной во Входных параметрах. Создайте структуру problem путем экспорта проблемы из приложения Оптимизации, как описано в Экспорте работы.

пример

[x,resnorm] = lsqnonlin(___), для любых входных параметров, возвращает значение квадратичной нормы невязки в 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)')

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

Найдите центрирование 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')

Сравните результаты соответствующей данным проблемы при использовании различных алгоритмов 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

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

k=110(2+2kekx1ekx2)2,

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

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

Fk(x)=2+2kekx1ekx2,

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

Во-первых, запишите файл, чтобы вычислить 10 - векторный F компонента.

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

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

x0 = [0.3,0.4];
[x,resnorm] = lsqnonlin(@myfun,x0);

Приблизительно после 24 функциональных оценок этот пример дает решение

x,resnorm
x = 
     0.2578   0.2578

resnorm = 
     124.3622

Исследуйте процесс решения оба, как это происходит (путем установки опции 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.000462263         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.00821621
    10          45          243424        1.61e+04        10000     0.00777935
    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.91e-05        1e-05    5.07033e-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.9122e-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 являются массивами, они преобразованы в векторы, использующие линейную индексацию (см. Индексацию массива (MATLAB)).

Примечание

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

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

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

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

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

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

PlotFcn

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

  • 'optimplotx' строит текущую точку.

  • 'optimplotfunccount' строит функциональное количество.

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

  • 'optimplotresnorm' строит норму невязок.

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

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

Для получения информации о записи пользовательской функции построения графика смотрите Синтаксис Функции построения графика.

Для 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) / ∂ x(j) ≠ 0.

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

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

MaxPCGIter

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

PrecondBandWidth

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

SubproblemAlgorithm

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

TolPCG

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

Алгоритм Levenberg-Marquardt
InitDamping

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

ScaleProblem

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

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

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

Имя поляЗапись

objective

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

x0

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

solver

'lsqnonlin'

options

Опции создаются с optimoptions

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

Самый простой способ получить структуру problem состоит в том, чтобы экспортировать проблему из приложения Оптимизации.

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

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

свернуть все

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

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

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

Обоснуйте, что остановленный решатель, возвратился как целое число.

1

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

2

Изменение в 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.

Ограничения

  • Алгоритм Levenberg-Marquardt не обрабатывает связанные ограничения.

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

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

  • lsqnonlin может решить проблемы с комплексным знаком непосредственно с алгоритмом levenberg-marquardt. Однако этот алгоритм не принимает связанные ограничения. Для комплексной проблемы со связанными ограничениями, разделение переменные в действительные и мнимые части и использование алгоритм trust-region-reflective. Сочтите целесообразным Модель к Данным с комплексным знаком.

  • Вычисление перед формирователем использовало в предобусловленной части метода сопряженных градиентов доверительной области, отражающий метод формирует 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 в сумме виртуальной памяти, доступной в системе.

Алгоритмы

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

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

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

Ссылки

[1] Коулман, Т.Ф. и И. Ли. “Внутренний, Доверительный Подход области для Нелинейной Минимизации Согласно Границам”. SIAM Journal на Оптимизации, Издании 6, 1996, стр 418–445.

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

[3] Деннис, J. E. “Нелинейный метод наименьших квадратов” младший. Состояние в Числовом Анализе, редакторе Д. Джейкобсе, Academic Press, стр 269–312.

[4] Levenberg, K. “Метод для Решения Определенных проблем в Наименьших квадратах”. Ежеквартальная Прикладная математика 2, 1944, стр 164–168.

[5] Marquardt, D. “Алгоритм для Оценки Наименьших квадратов Нелинейных Параметров”. Прикладная математика SIAM Journal, Издание 11, 1963, стр 431–441.

[6] Moré, J. J. “Алгоритм Levenberg-Marquardt: Реализация и Теория”. Числовой Анализ, редактор Г. А. Уотсон, Примечания Лекции в Математике 630, Springer Verlag, 1977, стр 105–116.

[7] Moré, J. J. бакалавр наук Гарбоу и К. Э. Хиллстром. Руководство пользователя для MINPACK 1. Национальная лаборатория Аргонна, Rept. ANL–80–74, 1980.

[8] Пауэлл, M. J. D. “Стандартная подпрограмма Фортрана для Решения Систем Нелинейных Алгебраических уравнений”. Численные методы для Нелинейных Алгебраических уравнений, П. Рабиновица, редактора, Ch.7, 1970.

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

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

Для просмотра документации необходимо авторизоваться на сайте