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 при вызове с 2 выходными аргументами также возвращает матрицу Якоби правых частей в запрошенной точке.

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

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

"TolX" задает толерантность к прекращению вычислений в неизвестных переменных, в то время как "TolFun" задает толерантность к уравнениям. По умолчанию это 1e-6 как для "TolX", так и для "TolFun".

Описание других параметров см. в 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–2023 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.2.0/Solvers.html

Spec-Zone.ru

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