Нули вектор-функции

Есть ли в MATLAB какая-либо функция, которая может найти нули вектор-функции? Обычно используемая функция fzero только для скалярных функций и также не может найти нули любой скалярной функции, такой как f(x)=x^2,

2 ответа

Решение

В наборе инструментов оптимизации Matlab есть метод fsolve, который утверждает, что он способен:

Решает проблему, указанную F(x) = 0 за x, где F(x) это функция, которая возвращает векторное значение х вектор или матрица.

В противном случае, поиск нулей обобщенной вектор-функции можно выполнить, пытаясь минимизировать норму векторного вывода. Давайте возьмем на себя вашу функцию F(x) выводит Nx1 вектор. Вы можете попытаться найти ноль, выполнив следующие действия:

 y = fminunc(@(x) sum(F(x).^2));

или же

 y = fminsearch(@(x) sum(F(x).^2));

Затем вам нужно будет проверить, вернулись ли y "достаточно близко" к нулю.

Последний комментарий fzero Алгоритм функции определяет существование корней, проверяя изменения знака. [Документы] прямо говорят, что

x = fzero(fun,x0) пытается найти точку x где fun(x) = 0, Это решение где fun(x) меняет знак. fzero не может найти корень функции, такой как x^2,

На самом деле, в более старых версиях Matlab (R2012b) fzeroВ документе есть раздел со своими ограничениями, в котором сказано

Команда fzero находит точку, где функция меняет знак. Если функция непрерывна, это также точка, где функция имеет значение, близкое к нулю. Если функция не является непрерывной, fzero может возвращать значения, которые являются прерывистыми точками вместо нулей. Например, fzero(@tan,1) возвращает 1.5708, прерывистую точку в tan.

Кроме того, команда fzero определяет ноль как точку, где функция пересекает ось X. Точки, где функция касается, но не пересекает оси X, не являются действительными нулями. Например, y = x.^2 - это парабола, которая касается оси x в 0. Поскольку функция никогда не пересекает ось X, однако, ноль не найден. Для функций без допустимых нулей, fzero выполняется до тех пор, пока не будут обнаружены Inf, NaN или комплексное значение.

Может быть, я неправильно понял что-то в вашем вопросе, но вы можете попробовать это решение:

y = @(x) x^2;

fminbnd(y, -100, 100)

ans =   -3.5527e-15

И, может быть, вы можете попробовать solve:

syms x y
y = @(x) x^2;
solve( y==0, x);

Не могу проверить это сейчас, я отредактирую это решение чуть позже.

Другие вопросы по тегам