Численное решение системы уравнений matlab

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

Доброго времени суток! В этой статье мы поговорим о решении систем нелинейных алгебраических уравнений в Matlab. Вслед за решением нелинейных уравнений, переходим к их системам, рассмотрим несколько методов реализации в Matlab.

Общая информация

Итак, в прошлой статье мы рассмотрели нелинейные уравнения и теперь необходимо решить системы таких уравнений. Система представляет собой набор нелинейных уравнений (их может быть два или более), для которых иногда возможно найти решение, которое будет подходить ко всем уравнениям в системе.

В стандартном виде, количество неизвестных переменных равно количеству уравнений в системе. Необходимо найти набор неизвестных переменных, которые при подставлении в уравнения будут приближать значение уравнения к 0. Иногда таких наборов может быть несколько, даже бесконечно много, а иногда решений не существует.

Чтобы решить СНАУ, необходимо воспользоваться итеративными методами. Это методы, которые за определенное количество шагов получают решение с определенной точностью. Также очень важно при решении задать достаточно близкое начальное приближение, то есть такой набор переменных, которые близки к решению. Если решается система из 2 уравнений, то приближение находится с помощью построение графика двух функций.

Далее, мы рассмотрим стандартный оператор Matlab для решения систем нелинейных алгебраических уравнений, а также напишем метод простых итераций и метод Ньютона.

Оператор Matlab для решения СНАУ

В среде Matlab существует оператор fsolve, который позволяет решить систему нелинейных уравнений. Сразу рассмотрим задачу, которую, забегая вперед, решим и другими методами для проверки.

Решить систему нелинейных уравнений с точность 10 -2 :
cos(x-1) + y = 0.5
x-cos(y) = 3

Нам дана система из 2 нелинейных уравнений и сначала лучше всего построить график. Воспользуемся командой ezplot в Matlab, только не забудем преобразовать уравнения к стандартному виду, где правая часть равна 0:

Функция ezplot строит график, принимая символьную запись уравнения, а для задания цвета и толщины линии воспользуемся функцией set. Посмотрим на вывод:

Как видно из графика, есть одно пересечение функций — то есть одно единственное решение данной системы нелинейных уравнений. И, как было сказано, по графику найдем приближение. Возьмем его как (3.0, 1.0). Теперь найдем решение с его помощью:

Создадим функцию m-файлом fun.m и поместим туда следующий код:

Заметьте, что эта функция принимает вектор приближений и возвращает вектор значений функции. То есть, вместо x здесь x(1), а вместо y — x(2). Это необходимо, потому что fsolve работает с векторами, а не с отдельными переменными.

И наконец, допишем функцию fsolve к коду построения графика таким образом:

Таким образом у нас образуется два m-файла. Первый строит график и вызывает функцию fsolve, а второй необходим для расчета самих значений функций. Если вы что-то не поняли, то в конце статьи будут исходники.

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

xr (это вектор решений) =
3.3559 1.2069

fr (это значения функций при таких xr, они должны быть близки к 0) =
1.0e-09 *
0.5420 0.6829

ex (параметр сходимости, если он равен 1, то все сошлось) =
1

И, как же без графика с ответом:

Метод простых итераций в Matlab для решения СНАУ

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

  1. Если возможно, строим график.
  2. Из каждого уравнения выражаем неизвестную переменную след. образом: из 1 уравнения выражаем x1, из второго — x2, и т.д.
  3. Выбираем начальное приближение X0, например (3.0 1.0)
  4. Рассчитываем значение x1, x2. xn, которые получили на шаге 2, подставив значения из приближения X0.
  5. Проверяем условие сходимости, (X-X0) должно быть меньше точности
  6. Если 5 пункт не выполнился, то повторяем 4 пункт.

И перейдем к практике, тут станет все понятнее.
Решить систему нелинейных уравнений методом простых итераций с точность 10 -2 :
cos(x-1) + y = 0.5
x-cos(y) = 3

График мы уже строили в предыдущем пункте, поэтому переходим к преобразованию. Увидим, что x из первого уравнения выразить сложно, поэтому поменяем местами уравнения, это не повлияет на решение:

x-cos(y) = 3
cos(x-1) + y = 0.5

Далее приведем код в Matlab:

В этой части мы выразили x1 и x2 (у нас это ‘x’ и ‘y’) и задали точность.

В этой части в цикле выполняются пункты 4-6. То есть итеративно меняются значения x и y, пока отличия от предыдущего значения не станет меньше заданной точности.

k = 10
x = 3.3587
y = 1.2088

Как видно, результаты немного отличаются от предыдущего пункта. Это связано с заданной точностью, можете попробовать поменять точность и увидите, что результаты станут такими же, как и при решении стандартным методом Matlab.

Метод Ньютона в Matlab для решения СНАУ

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

  1. Если возможно, строим график.
  2. Выбираем начальное приближение X0, например (3.0 1.0)
  3. Рассчитываем матрицу Якоби w, это матрица частных производных каждого уравнения, считаем ее определитель для X0.
  4. Находим вектор приращений, который рассчитывается как dx = -w -1 * f(X0)
  5. Находим вектор решения X = X0 + dx
  6. Проверяем условие сходимости, (X-X0) должно быть меньше точности

Далее, решим тот же пример, что и в предыдущих пунктах. Его график мы уже строили и начальное приближение останется таким же.
Решить систему нелинейных уравнений методом Ньютона с точность 10 -2 :
cos(x-1) + y = 0.5
x-cos(y) = 3

Перейдем к коду:

Сначала зададим начальное приближение. Затем необходимо просчитать матрицу Якоби, то есть частные производные по всем переменным. Воспользуемся символьным дифференцированием в Matlab, а именно командой diff с использованием символьных переменных.

Далее, сделаем первую итерацию метода, чтобы получить вектор выходных значений X, а потом уже сравнивать его с приближением в цикле.

В этой части кода выполняем первую итерацию, чтобы получить вектор решения и сравнивать его с вектором начального приближения. Отметим, чтобы посчитать значение символьной функции в Matlab, необходимо воспользоваться функцией subs. Эта функция заменяет переменную на числовое значение. Затем функция double рассчитает это числовое значение.

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

В этой части кода выполняется цикл по расчету решения с заданной точностью. Еще раз отметим, что если в первой итерации до цикла были использованы функции diff, double и subs для вычисления производной в Matlab, то в самом цикле матрица якоби была явно задана этими частными производными. Это сделано, чтобы показать возможности среды Matlab.

За 3 итерации достигнут правильный результат. Также важно сказать, что иногда такие методы могут зацикливаться и не закончить расчеты. Чтобы такого не было, мы прописали проверку на количество итераций и запретили выполнение более 100 итераций.

Заключение

В этой статье мы познакомились с основными понятиями систем нелинейных алгебраических уравнений в Matlab. Рассмотрели несколько вариантов их решения, как стандартными операторами Matlab, так и запрограммированными методами простых итераций и Ньютона.

Решение систем обыкновенных дифференциальных уравнений в среде MATLAB. Часть 1

В среде MATLAB можно решать системы диффуров с начальными условиями, краевые задачи, а также решать дифференциальные уравнения в частных производных с помощью инструмента PDE toolbox.

В данном обзоре речь пойдет лишь о системах дифференциальных уравнений с начальными условиями, то есть о задаче Коши. В англоязычной литературе это называется Initial Value Problem.

  • каким образом записывать системы диффуров
  • как задать начальные условия
  • временной интервал
  • какой получать результат решения для дальнего использования

Решать системы обыкновенных дифференциальных уравнений можно как в MATLAB, так и в Simulink.

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

Выбор ваш должен зависеть от задачи. Если Вы, например, хотите смоделировать какой-либо объект управления, описываемый системой диффуров, то в данном случае имеет смысл использовать именно Simulink, так как Вам, впоследствии, понадобиться синтез, например, системы управления, и Simulink подойдет здесь как нельзя лучше.

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

Рассмотрим синтаксис решателей matlab.В качестве аргументов следует подать правую часть системы в виде MATLAB-функции.

На рисунке показан требуемый вид системы, когда выражены старшие производные.

Системы, чей вид отличается от требуемого, следует преобразовать к таковому.

Если функция простая, то её можно записать прямо в поле аргумента, однако, когда речь идёт о системах уравнений, имеет смысл записывать систему уравнений в виде отдельной функции, в том числе и в виде отдельного м-файла. Об этом мы поговорим чуть позже и на конкретном примере.

Также подается интервал времени, на котором будет найдено решение. Интервал задаётся строкой из двух чисел: начальной величины независимого аргумента t и его конечного значения.

Далее задаются начальные условия. Значения всех неизвестных искомых переменных в начале расчёта задаются в виде столбца соответствующей размерности.

Далее, при необходимости, задаются опции. Вот тут и раскрываются широкие возможности MATLAB по настройке решателя. Помимо управления точностью и величиной шага, имеется возможность обрабатывать данные в процессе вычисления, а также выполнять скрипты по завершению вычисления. Но ещё более полезным является опция отслеживания событий по условию, более подробно поговорим об этом дальше. Также есть другие специальные опции, которые могут быть использованы при решении определённых типов систем.

Вы могли заметить, что название функции — odeXY – это обозначение для всех решателей, которых всего 8 штук. В данном ролике мы пользоваться решателем ode45, соответствующего численному по методу Дормана-Принса 4(5). Этого решателя достаточно для подавляющего большинства задач. Остальные решатели будут подробно рассмотрены в приложении к задачам соответствующих типов позже.

Перейдем к примерам.

Рассмотрим 2 примера:

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

В качестве уравнение первого порядка рассмотрим логистическое уравнение Ферхюльста, которое описывает динамику численности популяции. Суть уравнения такова: скорость прироста населения y пропорциональна количеству населения, однако лимитирована максимальной численностью популяции.

Забавный факт: Ферхюльст назвал это уравнение логистическим, и никто до сих пор не знает почему, ибо сам Ферхюльст об этом никому не рассказал.

Решение этого дифференциального уравнения выглядит следующим образом.

Пишем функцию в явном виде, задаём интервал расчёта и записываем начальное условие. Пару слов о записи функции подобным образом. Знак собаки в матлабе является оператором создания функции соответствующих переменных. Вы задаёте аргументы функции и саму функцию через пробел, как показано на рисунке.

Перейдем в окно MATLABа и посмотрим, как это выглядит.

Так выглядит скрипт:

Так выглядит график решения дифференциального уравнения:

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

Уравнения показаны на рисунке. Но вид системы отличается от требуемого, в том числе потому, что в нём присутствуют вторые производные. Для приведения системы в требуемый вид выполним 2 простых шага:

Первое: следует заменить переменные соответствующим образом. Теперь у нас 4 неизвестных. Далее следует преобразовать уравнение с учетом замены. Таким образом, мы имеем систему из четырёх дифференциальных уравнений первого порядка.

Настало время её записать.

Итак, мы имеем систему, параметры, интервал времени и начальные условия. Решим же эту задачу скорее.

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

Эту функцию можно располагать как в самом скрипте решения в самом его конце, так и в виде отдельного m-файла.

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

Теперь рассмотрим скрипт самого решения.

На этот раз запишем интервал и начальные условия в виде переменных MATLAB. Интервал, соответственно, в виде строки, а начальные условия – в виде столбца длинной 4.

Сообразно с уже разобранным ранее синтаксисом укажем функцию pendulum_np, интервал времени и начальные условия.

Перейдем теперь в окно MATLAB и посмотрим решение.

Так выглядит скрипт:

Запускаем скрипт и получаем графики:

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

На рисунке показана функция MATLAB, которая соответствует движению подвешенного на пружине шара, однако можно заметить, что эта функция теперь имеет на 5 аргументов больше.

Параметры задаются в скрипте, а при вызове функции мы обращаемся к уже известному оператору-собаке, которая превращает функцию семи переменных pendulum_n в функцию двух переменных t и X. Вот и всё.

Я вам очень рекомендую разобраться с тем, как работает оператор-собака. В хелпе он называется function-handle. Разобравшись с ним Вам будет работать в среде MATLAB ещё проще и ещё приятнее.

Вывод: не так страшно решать диффуры

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

Их можно, с одной стороны, разделить по степени жёсткости, а с другой стороны, по структуре самой системы.

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

Видеообзор по теме решения систем Д/У доступен по ссылке.

fsolve

Solve system of nonlinear equations

Syntax

Description

Nonlinear system solver

Solves a problem specified by

for x, where F( x) is a function that returns a vector value.

x is a vector or a matrix; see Matrix Arguments.

x = fsolve( fun , x0 ) starts at x0 and tries to solve the equations fun(x) = 0, an array of zeros.

Note

Passing Extra Parameters explains how to pass extra parameters to the vector function fun(x) , if necessary. See Solve Parameterized Equation.

x = fsolve( fun , x0 , options ) solves the equations with the optimization options specified in options . Use optimoptions to set these options.

x = fsolve( problem ) solves problem , a structure described in problem .

[ x , fval ] = fsolve( ___ ) , for any syntax, returns the value of the objective function fun at the solution x .

[ x , fval , exitflag , output ] = fsolve( ___ ) additionally returns a value exitflag that describes the exit condition of fsolve , and a structure output with information about the optimization process.

[ x , fval , exitflag , output , jacobian ] = fsolve( ___ ) returns the Jacobian of fun at the solution x .

Examples

Solution of 2-D Nonlinear System

This example shows how to solve two nonlinear equations in two variables. The equations are

Convert the equations to the form .

Write a function that computes the left-hand side of these two equations.

Save this code as a file named root2d.m on your MATLAB® path.

Solve the system of equations starting at the point [0,0] .

Solution with Nondefault Options

Examine the solution process for a nonlinear system.

Set options to have no display and a plot function that displays the first-order optimality, which should converge to 0 as the algorithm iterates.

The equations in the nonlinear system are

Convert the equations to the form .

Write a function that computes the left-hand side of these two equations.

Save this code as a file named root2d.m on your MATLAB® path.

Solve the nonlinear system starting from the point [0,0] and observe the solution process.

Solve Parameterized Equation

You can parameterize equations as described in the topic Passing Extra Parameters. For example, the paramfun helper function at the end of this example creates the following equation system parameterized by c :

2 x 1 + x 2 = exp ( c x 1 ) — x 1 + 2 x 2 = exp ( c x 2 ) .

To solve the system for a particular value, in this case c = — 1 , set c in the workspace and create an anonymous function in x from paramfun .

Solve the system starting from the point x0 = [0 1] .

To solve for a different value of c , enter c in the workspace and create the fun function again, so it has the new c value.

This code creates the paramfun helper function.

Solve a Problem Structure

Create a problem structure for fsolve and solve the problem.

Solve the same problem as in Solution with Nondefault Options, but formulate the problem using a problem structure.

Set options for the problem to have no display and a plot function that displays the first-order optimality, which should converge to 0 as the algorithm iterates.

The equations in the nonlinear system are

Convert the equations to the form .

Write a function that computes the left-hand side of these two equations.

Save this code as a file named root2d.m on your MATLAB® path.

Create the remaining fields in the problem structure.

Solve the problem.

Solution Process of Nonlinear System

This example returns the iterative display showing the solution process for the system of two equations and two unknowns

2 x 1 — x 2 = e — x 1 — x 1 + 2 x 2 = e — x 2 .

Rewrite the equations in the form F ( x ) = 0 :

2 x 1 — x 2 — e — x 1 = 0 — x 1 + 2 x 2 — e — x 2 = 0 .

Start your search for a solution at x0 = [-5 -5] .

First, write a function that computes F , the values of the equations at x .

Create the initial point x0 .

Set options to return iterative display.

Solve the equations.

The iterative display shows f(x) , which is the square of the norm of the function F(x) . This value decreases to near zero as the iterations proceed. The first-order optimality measure likewise decreases to near zero as the iterations proceed. These entries show the convergence of the iterations to a solution. For the meanings of the other entries, see Iterative Display.

The fval output gives the function value F(x) , which should be zero at a solution (to within the FunctionTolerance tolerance).

Examine Matrix Equation Solution

Find a matrix X that satisfies

X * X * X = [ 1 2 3 4 ] ,

starting at the point x0 = [1,1;1,1] . Create an anonymous function that calculates the matrix equation and create the point x0 .

Set options to have no display.

Examine the fsolve outputs to see the solution quality and process.

The exit flag value 1 indicates that the solution is reliable. To verify this manually, calculate the residual (sum of squares of fval) to see how close it is to zero.

This small residual confirms that x is a solution.

You can see in the output structure how many iterations and function evaluations fsolve performed to find the solution.

Input Arguments

fun — Nonlinear equations to solve
function handle | function name

Nonlinear equations to solve, specified as a function handle or function name. fun is a function that accepts a vector x and returns a vector F , the nonlinear equations evaluated at x . The equations to solve are F = 0 for all components of F . The function fun can be specified as a function handle for a file

where myfun is a MATLAB ® function such as

fun can also be a function handle for an anonymous function.

fsolve passes x to your objective function in the shape of the x0 argument. For example, if x0 is a 5-by-3 array, then fsolve passes x to fun as a 5-by-3 array.

If the Jacobian can also be computed and the ‘SpecifyObjectiveGradient’ option is true , set by

the function fun must return, in a second output argument, the Jacobian value J , a matrix, at x .

If fun returns a vector (matrix) of m components and x has length n , where n is the length of x0 , the Jacobian J is an m -by- n matrix where J(i,j) is the partial derivative of F(i) with respect to x(j) . (The Jacobian J is the transpose of the gradient of F .)

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

Data Types: char | function_handle | string

x0 — Initial point
real vector | real array

Initial point, specified as a real vector or real array. fsolve uses the number of elements in and size of x0 to determine the number and size of variables that fun accepts.

Example: x0 = [1,2,3,4]

Data Types: double

options — Optimization options
output of optimoptions | structure as optimset returns

Optimization options, specified as the output of optimoptions or a structure such as optimset returns.

Some options apply to all algorithms, and others are relevant for particular algorithms. See Optimization Options Reference for detailed information.

Some options are absent from the optimoptions display. These options appear in italics in the following table. For details, see View Options.

Choose between ‘trust-region-dogleg’ (default), ‘trust-region’ , and ‘levenberg-marquardt’ .

The Algorithm option specifies a preference for which algorithm to use. It is only a preference because for the trust-region algorithm, the nonlinear system of equations cannot be underdetermined; that is, the number of equations (the number of elements of F returned by fun ) must be at least as many as the length of x . Similarly, for the trust-region-dogleg algorithm, the number of equations must be the same as the length of x . fsolve uses the Levenberg-Marquardt algorithm when the selected algorithm is unavailable. For more information on choosing the algorithm, see Choosing the Algorithm.

To set some algorithm options using optimset instead of optimoptions :

Algorithm — Set the algorithm to ‘trust-region-reflective’ instead of ‘trust-region’ .

InitDamping — Set the initial Levenberg-Marquardt parameter λ by setting Algorithm to a cell array such as <'levenberg-marquardt',.005>.

Display diagnostic information about the function to be minimized or solved. The choices are ‘on’ or the default ‘off’ .

Maximum change in variables for finite-difference gradients (a positive scalar). The default is Inf .

Minimum change in variables for finite-difference gradients (a positive scalar). The default is 0 .

‘off’ or ‘none’ displays no output.

‘iter’ displays output at each iteration, and gives the default exit message.

‘iter-detailed’ displays output at each iteration, and gives the technical exit message.

‘final’ (default) displays just the final output, and gives the default exit message.

‘final-detailed’ displays just the final output, and gives the technical exit message.

Scalar or vector step size factor for finite differences. When you set FiniteDifferenceStepSize to a vector v , the forward finite differences delta are

For optimset , the name is FinDiffRelStep . See Current and Legacy Option Names.

Finite differences, used to estimate gradients, are either ‘forward’ (default), or ‘central’ (centered). ‘central’ takes twice as many function evaluations, but should be more accurate.

The algorithm is careful to obey bounds when estimating both types of finite differences. So, for example, it could take a backward, rather than a forward, difference to avoid evaluating at a point outside bounds.

For optimset , the name is FinDiffType . See Current and Legacy Option Names.

Termination tolerance on the function value, a positive scalar. The default is 1e-6 . See Tolerances and Stopping Criteria.

For optimset , the name is TolFun . See Current and Legacy Option Names.

Check whether objective function values are valid. ‘on’ displays an error when the objective function returns a value that is complex , Inf , or NaN . The default, ‘off’ , displays no error.

Maximum number of function evaluations allowed, a positive integer. The default is 100*numberOfVariables . See Tolerances and Stopping Criteria and Iterations and Function Counts.

For optimset , the name is MaxFunEvals . See Current and Legacy Option Names.

Maximum number of iterations allowed, a positive integer. The default is 400 . See Tolerances and Stopping Criteria and Iterations and Function Counts.

For optimset , the name is MaxIter . See Current and Legacy Option Names.

Termination tolerance on the first-order optimality (a positive scalar). The default is 1e-6 . See First-Order Optimality Measure.

Internally, the ‘levenberg-marquardt’ algorithm uses an optimality tolerance (stopping criterion) of 1e-4 times FunctionTolerance and does not use OptimalityTolerance .

Specify one or more user-defined functions that an optimization function calls at each iteration. Pass a function handle or a cell array of function handles. The default is none ( [] ). See Output Function and Plot Function Syntax.

Plots various measures of progress while the algorithm executes; select from predefined plots or write your own. Pass a built-in plot function name, a function handle, or a cell array of built-in plot function names or function handles. For custom plot functions, pass function handles. The default is none ( [] ):

‘optimplotx’ plots the current point.

‘optimplotfunccount’ plots the function count.

‘optimplotfval’ plots the function value.

‘optimplotstepsize’ plots the step size.

‘optimplotfirstorderopt’ plots the first-order optimality measure.

Custom plot functions use the same syntax as output functions. See Output Functions for Optimization Toolbox™ and Output Function and Plot Function Syntax.

For optimset , the name is PlotFcns . See Current and Legacy Option Names.

If true , fsolve uses a user-defined Jacobian (defined in fun ), or Jacobian information (when using JacobianMultiplyFcn ), for the objective function. If false (default), fsolve approximates the Jacobian using finite differences.

For optimset , the name is Jacobian and the values are ‘on’ or ‘off’ . See Current and Legacy Option Names.

Termination tolerance on x , a positive scalar. The default is 1e-6 . See Tolerances and Stopping Criteria.

For optimset , the name is TolX . See Current and Legacy Option Names.

Typical x values. The number of elements in TypicalX is equal to the number of elements in x0 , the starting point. The default value is ones(numberofvariables,1) . fsolve uses TypicalX for scaling finite differences for gradient estimation.

The trust-region-dogleg algorithm uses TypicalX as the diagonal terms of a scaling matrix.

When true , fsolve estimates gradients in parallel. Disable by setting to the default, false . See Parallel Computing.

Jacobian multiply function, specified as a function handle. For large-scale structured problems, this function computes the Jacobian matrix product J*Y , J’*Y , or J’*(J*Y) without actually forming J . The function is of the form

where Jinfo contains a matrix used to compute J*Y (or J’*Y , or J’*(J*Y) ). The first argument Jinfo must be the same as the second argument returned by the objective function fun , for example, in

Y is a matrix that has the same number of rows as there are dimensions in the problem. flag determines which product to compute:

If flag == 0 , W = J’*(J*Y) .

If flag > 0 , W = J*Y .

In each case, J is not formed explicitly. fsolve uses Jinfo to compute the preconditioner. See Passing Extra Parameters for information on how to supply values for any additional parameters jmfun needs.

Note

‘SpecifyObjectiveGradient’ must be set to true for fsolve to pass Jinfo from fun to jmfun .

For optimset , the name is JacobMult . See Current and Legacy Option Names.

Sparsity pattern of the Jacobian for finite differencing. Set JacobPattern(i,j) = 1 when fun(i) depends on x(j) . Otherwise, set JacobPattern(i,j) = 0 . In other words, JacobPattern(i,j) = 1 when you can have ∂ fun(i) /∂ x(j) ≠ 0.

Use JacobPattern when it is inconvenient to compute the Jacobian matrix J in fun , though you can determine (say, by inspection) when fun(i) depends on x(j) . fsolve can approximate J via sparse finite differences when you give JacobPattern .

In the worst case, if the structure is unknown, do not set JacobPattern . The default behavior is as if JacobPattern is a dense matrix of ones. Then fsolve computes a full finite-difference approximation in each iteration. This can be very expensive for large problems, so it is usually better to determine the sparsity structure.

Maximum number of PCG (preconditioned conjugate gradient) iterations, a positive scalar. The default is max(1,floor(numberOfVariables/2)) . For more information, see Equation Solving Algorithms.

Upper bandwidth of preconditioner for PCG, a nonnegative integer. The default PrecondBandWidth is Inf , which means a direct factorization (Cholesky) is used rather than the conjugate gradients (CG). The direct factorization is computationally more expensive than CG, but produces a better quality step towards the solution. Set PrecondBandWidth to 0 for diagonal preconditioning (upper bandwidth of 0). For some problems, an intermediate bandwidth reduces the number of PCG iterations.

Determines how the iteration step is calculated. The default, ‘factorization’ , takes a slower but more accurate step than ‘cg’ . See Trust-Region Algorithm.

Termination tolerance on the PCG iteration, a positive scalar. The default is 0.1 .

Initial value of the Levenberg-Marquardt parameter, a positive scalar. Default is 1e-2 . For details, see Levenberg-Marquardt Method.

‘jacobian’ can sometimes improve the convergence of a poorly scaled problem. The default is ‘none’ .

Example: options = optimoptions(‘fsolve’,’FiniteDifferenceType’,’central’)


источники:

http://hub.exponenta.ru/post/chislennoe-reshenie-differentsialnykh-uravneniy-v-srede-matlab-s-pomoshchyu-vstroennykh-instrumentov722

http://www.mathworks.com/help/optim/ug/fsolve.html

All Algorithms
Algorithm
CheckGradients

Compare user-supplied derivatives (gradients of objective or constraints) to finite-differencing derivatives. The choices are true or the default false .

For optimset , the name is DerivativeCheck and the values are ‘on’ or ‘off’ . See Current and Legacy Option Names.

Diagnostics
DiffMaxChange
DiffMinChange
FiniteDifferenceStepSize
FiniteDifferenceType
FunctionTolerance
FunValCheck
MaxFunctionEvaluations
MaxIterations
OptimalityTolerance
SpecifyObjectiveGradient
StepTolerance
UseParallel
trust-region Algorithm
JacobianMultiplyFcn
JacobPattern
MaxPCGIter
PrecondBandWidth
SubproblemAlgorithm
Levenberg-Marquardt Algorithm
InitDamping
ScaleProblem