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));

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

Создайте анонимную функцию, которая принимает значение экспоненциального уровня затухания 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+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.000462262         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.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 массивы, они преобразованы в векторы, использующие линейную индексацию (см. Индексацию массива).

Примечание

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

Если якобиан может также быть вычислен и '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. Для получения дополнительной информации о выборе алгоритма смотрите Выбор Algorithm.

CheckGradients

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

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

Диагностика

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

DiffMaxChange

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

DiffMinChange

Минимальное изменение в переменных для градиентов конечной разности (положительная скалярная величина). Значением по умолчанию является 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

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

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

FunValCheck

Проверяйте, допустимы ли значения функции. 'on' отображает ошибку, когда функция возвращает значение, которое является complexInf, или 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' строит меру оптимальности первого порядка.

Пользовательские функции построения графика используют тот же синтаксис в качестве выходных функций. Смотрите Выходные функции для 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)/ ∂x(j)  ≠ 0.

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

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

MaxPCGIter

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

PrecondBandWidth

Верхняя пропускная способность предварительного формирователя для PCG, неотрицательного целого числа. PrecondBandWidth по умолчанию isinf, что означает, что прямая факторизация (Холесский) используется, а не методы сопряженных градиентов (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

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

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

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

свернуть все

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

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

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

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

1

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

2

Изменитесь в x меньше заданного допуска или якобиана в x isundefined.

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 использует алгоритм Levenberg-Marquardt.

  • 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 в сумме виртуальной памяти, доступной в системе.

Алгоритмы

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

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

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

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

Приложение

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

Ссылки

[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