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/v8.1.0/Solvers.html