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, ...))
Следующий пример является полным. Чтобы решить систему уравнений
-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.
© 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