20.1 Решатели
Octave может решать системы нелинейных уравнений вида
F (x) = 0
используя функцию fsolve, основанную на подпрограмме MINPACK hybrd. Это итеративный метод, поэтому необходимо указать начальную точку. Это также означает, что сходимость не гарантируется, даже если решение существует.
- fsolve (fcn, x0)
- fsolve (fcn, x0, options)
- [x, fval, info, output, fjac] = fsolve (…)
-
Решает систему нелинейных уравнений, заданных функцией fcn.
fun — это дескриптор функции, встроенная функция или строка, содержащая имя функции для вычисления. 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_func (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_func, x0, optimset ("OutputFcn", @user_func, …))
Следующий пример является полным. Чтобы решить систему уравнений
-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"));
что даёт то же самое решение, что и раньше.
- fzero (fun, x0)
- fzero (fun, x0, options)
- [x, fval, info, output] = fzero (…)
-
Находит нуль одномерной функции.
fun — это дескриптор функции, встроенная функция или строка, содержащая имя функции для вычисления.
x0 должен быть вектором из двух элементов, определяющим два значения, которые обрамляют нуль. Другими словами, должно быть изменение знака функции между x0(1) и x0(2). Математически это выражается следующим образом:
sign (fun(x0(1))) * sign (fun(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–2022 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/v6.4.0/Solvers.html