fsolve

Решите систему нелинейных уравнений

Описание

Нелинейный системный решатель

Решает задачу, заданную

F (x) = 0

для x, где F (x) является функцией, которая возвращает векторное значение.

x является вектором или матрицей; смотрите Матричные аргументы.

пример

x = fsolve(fun,x0) запускается в x0 и попытки решить уравнения  fun(x) = 0, массив нулей.

Примечание

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

пример

x = fsolve(fun,x0,options) решает уравнения с опциями оптимизации, заданными в optionsИспользование optimoptions установить эти опции.

пример

x = fsolve(problem) решает problem, структура описана в problem.

пример

[x,fval] = fsolve(___), для любого синтаксиса, возвращает значение целевой функции fun в решении x.

пример

[x,fval,exitflag,output] = fsolve(___) дополнительно возвращает значение exitflag это описывает выходное условие fsolve, и структура output с информацией о процессе оптимизации.

[x,fval,exitflag,output,jacobian] = fsolve(___) возвращает якобиан fun в решении x.

Примеры

свернуть все

В этом примере показано, как решить два нелинейных уравнения в двух переменных. Уравнения

$$ \begin{array}{c}
{e^{ - {e^{ - ({x_1} + {x_2})}}}} = {x_2}\left( {1 + x_1^2} \right)\\
{x_1}\cos \left( {{x_2}} \right) + {x_2}\sin \left( {{x_1}} \right) = \frac{1}{2}.
\end{array} $$

Преобразуйте уравнения в форму$F(x) = \bf{0}$.

$$\begin{array}{c}
{e^{ - {e^{ - ({x_1} + {x_2})}}}} - {x_2}\left( {1 + x_1^2} \right) = 0\\
{x_1}\cos \left( {{x_2}} \right) + {x_2}\sin \left( {{x_1}} \right)
- \frac{1}{2} = 0. \end{array} $$

Запишите функцию, которая вычисляет левую сторону этих двух уравнений.

function F = root2d(x)

F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;

Сохраните этот код как файл с именем root2d.m на вашем пути MATLAB®.

Решите систему уравнений, запускающуюся в точке [0,0].

fun = @root2d;
x0 = [0,0];
x = fsolve(fun,x0)
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.


x =

    0.3532    0.6061

Исследуйте процесс решения на нелинейную систему.

Установите опции не иметь никакого отображения и функции построения графика, которая отображает оптимальность первого порядка, которая должна сходиться к 0, когда алгоритм выполняет итерации.

options = optimoptions('fsolve','Display','none','PlotFcn',@optimplotfirstorderopt);

Уравнения в нелинейной системе

$$\begin{array}{c}
{e^{ - {e^{ - ({x_1} + {x_2})}}}} = {x_2}\left( {1 + x_1^2} \right)\\
{x_1}\cos \left( {{x_2}} \right) + {x_2}\sin \left( {{x_1}} \right) = \frac{1}{2}.
\end{array} $$

Преобразуйте уравнения в форму$F(x) = \bf{0}$.

$$\begin{array}{c}
{e^{ - {e^{ - ({x_1} + {x_2})}}}} - {x_2}\left( {1 + x_1^2} \right) = 0\\
{x_1}\cos \left( {{x_2}} \right) + {x_2}\sin \left( {{x_1}} \right)
- \frac{1}{2} = 0. \end{array} $$

Запишите функцию, которая вычисляет левую сторону этих двух уравнений.

function F = root2d(x)

F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;

Сохраните этот код как файл с именем root2d.m на вашем пути MATLAB®.

Решите нелинейную систему, начинающую с точки [0,0] и наблюдайте процесс решения.

fun = @root2d;
x0 = [0,0];
x = fsolve(fun,x0,options)
x =

    0.3532    0.6061

Можно параметрировать уравнения как описано в теме, Передающей Дополнительные Параметры. Например, paramfun функция помощника в конце этого примера создает следующую систему уравнения, параметрированную c:

2x1+x2=exp(cx1)-x1+2x2=exp(cx2).

Решить систему для особого значения, в этом случае c=-1Набор c в рабочей области и создают анонимную функцию в x от paramfun.

c = -1;
fun = @(x)paramfun(x,c);

Решите систему, начинающую с точки x0 = [0 1].

x0 = [0 1];
x = fsolve(fun,x0)
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
x = 1×2

    0.1976    0.4255

Решить для различного значения c, войти c в рабочей области и создают fun функционируйте снова, таким образом, это имеет новое c значение.

c = -2;
fun = @(x)paramfun(x,c); % fun now has the new c value
x = fsolve(fun,x0)
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
x = 1×2

    0.1788    0.3418

Функция помощника

Этот код создает paramfun функция помощника.

function F = paramfun(x,c)
F = [ 2*x(1) + x(2) - exp(c*x(1))
      -x(1) + 2*x(2) - exp(c*x(2))];
end

Создайте структуру задачи для fsolve и решите задачу.

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

Установите опции для проблемы не иметь никакого отображения и функции построения графика, которая отображает оптимальность первого порядка, которая должна сходиться к 0, когда алгоритм выполняет итерации.

problem.options = optimoptions('fsolve','Display','none','PlotFcn',@optimplotfirstorderopt);

Уравнения в нелинейной системе

$$\begin{array}{c}
{e^{ - {e^{ - ({x_1} + {x_2})}}}} = {x_2}\left( {1 + x_1^2} \right)\\
{x_1}\cos \left( {{x_2}} \right) + {x_2}\sin \left( {{x_1}} \right) = \frac{1}{2}.
\end{array} $$

Преобразуйте уравнения в форму$F(x) = \bf{0}$.

$$\begin{array}{c}
{e^{ - {e^{ - ({x_1} + {x_2})}}}} - {x_2}\left( {1 + x_1^2} \right) = 0\\
{x_1}\cos \left( {{x_2}} \right) + {x_2}\sin \left( {{x_1}} \right)
- \frac{1}{2} = 0. \end{array} $$

Запишите функцию, которая вычисляет левую сторону этих двух уравнений.

function F = root2d(x)

F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;

Сохраните этот код как файл с именем root2d.m на вашем пути MATLAB®.

Создайте остающиеся поля в структуре задачи.

problem.objective = @root2d;
problem.x0 = [0,0];
problem.solver = 'fsolve';

Решите задачу.

x = fsolve(problem)
x =

    0.3532    0.6061

Этот пример возвращает итеративное отображение, показывающее процесс решения для системы двух уравнений и двух неизвестных

2x1-x2=e-x1-x1+2x2=e-x2.

Перепишите уравнения в форме F(x) = 0:

2x1-x2-e-x1=0-x1+2x2-e-x2=0.

Запустите свой поиск решения в x0 = [-5 -5].

Во-первых, запишите функцию, которая вычисляет F, значения уравнений в x.

F = @(x) [2*x(1) - x(2) - exp(-x(1));
         -x(1) + 2*x(2) - exp(-x(2))];

Создайте начальную точку x0.

x0 = [-5;-5];

Установите опции возвращать итеративное отображение.

options = optimoptions('fsolve','Display','iter');

Решите уравнения.

[x,fval] = fsolve(F,x0,options)
                                         Norm of      First-order   Trust-region
 Iteration  Func-count     f(x)          step         optimality    radius
     0          3         47071.2                      2.29e+04               1
     1          6         12003.4              1       5.75e+03               1
     2          9         3147.02              1       1.47e+03               1
     3         12         854.452              1            388               1
     4         15         239.527              1            107               1
     5         18         67.0412              1           30.8               1
     6         21         16.7042              1           9.05               1
     7         24         2.42788              1           2.26               1
     8         27        0.032658       0.759511          0.206             2.5
     9         30     7.03149e-06       0.111927        0.00294             2.5
    10         33     3.29525e-13     0.00169132       6.36e-07             2.5

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
x = 2×1

    0.5671
    0.5671

fval = 2×1
10-6 ×

   -0.4059
   -0.4059

Итеративное отображение показывает f(x), который является квадратом нормы функционального F(x). Это значение уменьшается к почти нулю, в то время как итерации продолжают. Мера оптимальности первого порядка аналогично уменьшается к почти нулю, в то время как итерации продолжают. Эти записи показывают сходимость итераций к решению. Для значений других записей смотрите Итеративное Отображение.

fval выведите дает значению функции F(x), который должен быть нулем в решении (к в FunctionTolerance допуск.

Найдите матрицу X это удовлетворяет

X*X*X=[1234],

запуск в точке x0 = [1,1;1,1]. Создайте анонимную функцию, которая вычисляет матричное уравнение, и создайте точку x0.

fun = @(x)x*x*x - [1,2;3,4];
x0 = ones(2);

Установите опции не иметь никакого отображения.

options = optimoptions('fsolve','Display','off');

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

[x,fval,exitflag,output] = fsolve(fun,x0,options)
x = 2×2

   -0.1291    0.8602
    1.2903    1.1612

fval = 2×2
10-9 ×

   -0.1621    0.0780
    0.1160   -0.0474

exitflag = 1
output = struct with fields:
       iterations: 6
        funcCount: 35
        algorithm: 'trust-region-dogleg'
    firstorderopt: 2.4093e-10
          message: '...'

Выходное флаговое значение 1 указывает, что решение надежно. Чтобы проверить это вручную, вычислите невязку (сумма квадратов fval), чтобы видеть, как близко это должно обнулить.

sum(sum(fval.*fval))
ans = 4.8062e-20

Эта маленькая невязка подтверждает тот x решение.

Вы видите в output структура, сколько итераций и вычислений функции fsolve выполняемый, чтобы найти решение.

Входные параметры

свернуть все

Нелинейные уравнения, чтобы решить в виде указателя на функцию или имени функции. fun функция, которая принимает векторный x и возвращает векторный F, нелинейные уравнения оценены в x. Уравнениями, чтобы решить является F = 0 для всех компонентов F. Функциональный fun может быть определен функцией указатель для файла

x = fsolve(@myfun,x0)

где myfun MATLAB® функционируйте такой как

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

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

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

fsolve передачи x к вашей целевой функции в форме x0 аргумент. Например, если x0 5 3 массив, затем fsolve передачи x к fun как 5 3 массив.

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

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

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

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

Пример: fun = @(x)x*x*x-[1,2;3,4]

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

Начальная точка в виде вектора действительных чисел или действительного массива. fsolve использует число элементов в и размер x0 определить номер и размер переменных что fun принимает.

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

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

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

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

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

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

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

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

Установить некоторое использование опций алгоритма optimset вместо optimoptions:

  • Algorithm — Установите алгоритм на 'trust-region-reflective' вместо 'trust-region'.

  • InitDamping — Установите начальный параметр Levenberg-Marquardt λ установкой Algorithm к массиву ячеек, такому как {'levenberg-marquardt',.005}.

CheckGradients

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

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

Диагностика

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

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.

OutputFcn

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

PlotFcn

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

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

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

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

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

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

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

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

SpecifyObjectiveGradient

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

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

StepTolerance

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

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

TypicalX

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

trust-region-dogleg алгоритм использует TypicalX как диагональные термины масштабирующейся матрицы.

UseParallel

Когда true, fsolve оценочные градиенты параллельно. Отключите путем установки на значение по умолчанию, 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 не формируется явным образом. fsolve использование Jinfo вычислить предварительный формирователь. Смотрите Передающие Дополнительные Параметры для получения информации о том, как предоставить значения для любых дополнительных параметров jmfun потребности.

Примечание

'SpecifyObjectiveGradient' должен быть установлен в true для fsolve передать 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). fsolve может аппроксимировать J через разреженные конечные разности, когда вы даете JacobPattern.

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

MaxPCGIter

Максимальное количество PCG (предобусловленный метод сопряженных градиентов) итерации, положительная скалярная величина. Значением по умолчанию является max(1,floor(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('fsolve','FiniteDifferenceType','central')

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

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

objective

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

x0

Начальная точка для x

solver

'fsolve'

options

Опции, созданные с optimoptions

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

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

свернуть все

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

Значение целевой функции в решении, возвращенном как вектор действительных чисел. Обычно fval = fun(x).

Причина fsolve остановленный, возвращенный как целое число.

1

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

2

Уравнение решено. Изменитесь в x меньший, чем заданный допуск или якобиан в x isundefined.

3

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

4

Уравнение решено. Величина поискового направления, меньшего, чем заданный допуск.

0

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

-1

Выходная функция или функция построения графика остановили алгоритм.

-2

Уравнение, не решенное. Выходное сообщение может иметь больше информации.

-3

Уравнение, не решенное. Доверительный радиус области стал слишком маленьким (trust-region-dogleg алгоритм).

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

iterations

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

funcCount

Количество вычислений функции

algorithm

Алгоритм оптимизации используется

cgiterations

Общее количество итераций PCG ('trust-region' только алгоритм)

stepsize

Итоговое смещение в x (не в 'trust-region-dogleg')

firstorderopt

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

message

Выходное сообщение

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

Ограничения

  • Функция, которая будет решена, должна быть непрерывной.

  • Когда успешный, fsolve только дает один корень.

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

Советы

  • Для больших проблем, означая тех с тысячами переменных или больше, сохраняют память (и возможно сэкономьте время) путем установки Algorithm опция к 'trust-region' и SubproblemAlgorithm опция к 'cg'.

Алгоритмы

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

  • По умолчанию fsolve выбирает алгоритм резкого искривления доверительной области. Алгоритм является вариантом метода резкого искривления Пауэлла, описанного в [8]. Это похоже по своей природе на алгоритм, реализованный в [7]. См. Алгоритм Доверительного Резкого искривления Области.

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

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

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

Приложение

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

Ссылки

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

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

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

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

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

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

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

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

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

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