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/v7.2.0/Solvers.html