Spec-Zone.ru › Octave 9

20.1 Решение уравнений

Octave может решать системы нелинейных уравнений вида

F (x) = 0

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

: x = fsolve (fcn, x0)
: x = fsolve (fcn, x0, options)
: [x, fval] = fsolve (…)
: [x, fval, info] = fsolve (…)
: [x, fval, info, output] = fsolve (…)
: [x, fval, info, output, fjac] = fsolve (…)

Решает систему нелинейных уравнений, заданную функцией fcn.

fcn — это дескриптор функции, встроенная функция или строка, содержащая имя вычисляемой функции. Функция fcn должна принимать вектор (массив), задающий неизвестные переменные, и возвращать вектор левых частей уравнений. Правые части считаются равными нулю. Иными словами, эта функция пытается найти вектор x, такой что fcn (x) даёт (приблизительно) одни нули.

x0 — начальное приближение решения. Форма x0 сохраняется во всех вызовах fcn, но в остальном он рассматривается как вектор-столбец.

options — структура, задающая дополнительные параметры управления алгоритмом. В настоящее время fsolve распознаёт следующие параметры: "AutoScaling", "ComplexEqn", "FinDiffType", "FunValCheck", "Jacobian", "MaxFunEvals", "MaxIter", "OutputFcn", "TolFun", "TolX", "TypicalX" и "Updating".

Если "AutoScaling" имеет значение "on", переменные автоматически масштабируются в соответствии с нормами столбцов (оценённой) матрицы Якоби. В результате "TolFun" становится независимым от масштабирования. По умолчанию этому параметру присваивается значение "off", поскольку иногда он может приводить к неожиданным (хотя и математически корректным) результатам.

Если "ComplexEqn" имеет значение "on", fsolve будет пытаться решать комплексные уравнения относительно комплексных переменных, предполагая, что уравнения имеют комплексную производную (то есть являются голоморфными). Если это не то, что вам нужно, следует разложить систему на действительную и мнимую части, чтобы получить систему действительных уравнений.

Если "Jacobian" имеет значение "on", это указывает, что функция fcn при вызове с двумя выходными аргументами также возвращает матрицу Якоби правых частей в заданной точке.

"MaxFunEvals" задаёт максимальное количество вычислений функции, после которого оптимизация прекращается. Значение по умолчанию — 100 * number_of_variables, то есть 100 * length (x0). Значение должно быть положительным целым числом.

Если "Updating" имеет значение "on", функция будет пытаться использовать обновления Бройдена для обновления матрицы Якоби, чтобы сократить количество её вычислений. Если пользовательская функция всегда вычисляет матрицу Якоби (независимо от количества выходных аргументов), этот параметр не даёт преимуществ, и его следует отключить.

"TolX" задаёт допуск сходимости для неизвестных переменных, а "TolFun" — допуск для уравнений. Значение по умолчанию для обоих параметров, "TolX" и "TolFun", — 1e-6.

Описание остальных параметров см. в разделе optimset. Чтобы инициализировать структуру параметров значениями по умолчанию для fsolve, используйте options = optimset ("fsolve").

Первый выходной аргумент x — это решение, а второй выходной аргумент fval содержит значение функции fcn, вычисленное в точке x (в идеале — вектор, состоящий из нулей).

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

1

Найдено решение. Относительная ошибка остатка меньше значения, заданного параметром TolFun.

2

Последний относительный размер шага был меньше TolX.

3

Последнее относительное уменьшение остатка было меньше TolFun.

0

Превышен предел числа итераций (MaxIter или MaxFunEvals).

-1

Остановлено параметром OutputFcn.

-2

Матрица Якоби стала чрезмерно малой, и поиск остановился.

-3

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

output — структура, содержащая информацию о времени выполнения алгоритма fsolve. Структура содержит следующие поля:

iterations

Количество итераций цикла.

successful

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

funcCount

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

Последний выходной аргумент fjac содержит значение матрицы Якоби, вычисленной в точке x.

Примечание: если у вас есть только одно нелинейное уравнение с одной переменной, обычно гораздо лучше использовать fzero.

Примечание о матрицах Якоби, предоставляемых пользователем: из-за особенностей алгоритма матрица Якоби всегда запрашивается для вектора решения, вектор остатка которого уже известен; это последний принятый успешный шаг. Часто это один из двух последних вызовов, но не всегда. Если повторное использование промежуточных результатов вычисления остатка при вычислении матрицы Якоби позволяет существенно сократить затраты, лучше всего использовать OutputFcn: после вычисления остатка для вектора, если OutputFcn вызывается с этим вектором, промежуточные результаты следует сохранить для последующего вычисления матрицы Якоби и хранить до тех пор, пока не будет запрошено вычисление матрицы Якоби или пока OutputFcn не будет вызвана с другим вектором; в последнем случае их следует отбросить и сохранить результаты для последнего вектора. Ниже приведён краткий пример того, как это можно реализовать:

function [fval, fjac] = user_fcn (x, optimvalues, state)
persistent sav = [], sav0 = [];
if (nargin == 1)
  ## evaluation call
  if (nargout == 1)
    sav0.x = x; # mark saved vector
    ## calculate fval, save results to sav0.
  elseif (nargout == 2)
    ## calculate fjac using sav.
  endif
else
  ## outputfcn call.
  if (all (x == sav0.x))
    sav = sav0;
  endif
  ## maybe output iteration status, etc.
endif
endfunction

## ...

fsolve (@user_fcn, x0, optimset ("OutputFcn", @user_fcn, ...))

См. также: fzero, optimset.

Ниже приведён полный пример. Чтобы решить систему уравнений

-2x^2 + 3xy   + 4 sin(y) = 6
 3x^2 - 2xy^2 + 3 cos(x) = -4

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

function y = f (x)
  y = zeros (2, 1);
  y(1) = -2*x(1)^2 + 3*x(1)*x(2)   + 4*sin(x(2)) - 6;
  y(2) =  3*x(1)^2 - 2*x(1)*x(2)^2 + 3*cos(x(1)) + 4;
endfunction

Затем вызовите fsolve, задав начальное условие, чтобы найти корни системы уравнений. Например, для функции f, определённой выше,

[x, fval, info] = fsolve (@f, [1; 2])

получаем решение

x =

  0.57983
  2.54621

fval =

  -5.7184e-10
   5.5460e-10

info = 1

Значение info = 1 указывает на то, что решение сошлось.

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

function [y, jac] = f (x)
  y = zeros (2, 1);
  y(1) = -2*x(1)^2 + 3*x(1)*x(2)   + 4*sin(x(2)) - 6;
  y(2) =  3*x(1)^2 - 2*x(1)*x(2)^2 + 3*cos(x(1)) + 4;
  if (nargout == 2)
    jac = zeros (2, 2);
    jac(1,1) =  3*x(2) - 4*x(1);
    jac(1,2) =  4*cos(x(2)) + 3*x(1);
    jac(2,1) = -2*x(2)^2 - 3*sin(x(1)) + 6*x(1);
    jac(2,2) = -4*x(1)*x(2);
  endif
endfunction

Затем матрицу Якоби можно использовать при следующем вызове fsolve:

[x, fval, info] = fsolve (@f, [1; 2], optimset ("jacobian", "on"));

который даёт то же решение, что и ранее.

: x = fzero (fcn, x0)
: x = fzero (fcn, x0, options)
: [x, fval] = fzero (…)
: [x, fval, info] = fzero (…)
: [x, fval, info, output] = fzero (…)

Находит нуль функции одной переменной.

fcn — это дескриптор функции, встроенная функция или строка, содержащая имя вычисляемой функции.

x0 должен быть вектором из двух элементов, задающим две точки, между которыми находится нуль. Иными словами, функция должна менять знак между x0(1) и x0(2). В математической записи это означает, что должно выполняться следующее условие:

sign (fcn(x0(1))) * sign (fcn(x0(2))) <= 0

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

options — структура, задающая дополнительные параметры. В настоящее время fzero распознаёт следующие параметры: "Display", "FunValCheck", "MaxFunEvals", "MaxIter", "OutputFcn" и "TolX".

"MaxFunEvals" задаёт максимальное количество вычислений функции, после которого поиск прекращается. Значение по умолчанию — Inf. Значение должно быть положительным целым числом.

"MaxIter" задаёт максимальное количество итераций алгоритма, после которого поиск прекращается. Значение по умолчанию — Inf. Значение должно быть положительным целым числом.

"TolX" задаёт допуск сходимости для решения x. Значение по умолчанию — eps.

Описание остальных параметров см. в разделе optimset. Чтобы инициализировать структуру параметров значениями по умолчанию для fzero, используйте options = optimset ("fzero").

При завершении функция возвращает x — приближённое значение корня, и fval — значение функции, вычисленное в точке x.

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

  • 1 Алгоритм нашёл решение.
  • 0 Достигнуто максимальное количество итераций или вычислений функции.
  • -1 Алгоритм остановлен пользовательским OutputFcn.
  • -5 Возможно, алгоритм сошёлся к особой точке.

output — структура, содержащая информацию о времени выполнения алгоритма fzero. Структура содержит следующие поля:

  • iterations Количество итераций цикла.
  • funcCount Количество вычислений функции.
  • algorithm Строка "bisection, interpolation".
  • bracketx Вектор из двух элементов с итоговым интервалом, содержащим нуль, на оси x.
  • brackety Вектор из двух элементов с итоговым интервалом, содержащим нуль, на оси y.

См. также: optimset, fsolve.

© 1996–2026 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v9.4.0/Solvers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API