Есть ли в MATLAB функция, которая может найти нули вектор-функции? Обычно используемая функция fzero
предназначена только для скалярных функций и также не может найти нули любой скалярной функции, такой как f(x)=x^2
.
нули вектор-функции
- Чтобы уточнить, это набор независимых уравнений, которые вы хотите решить вместе (обычно это делается с помощью цикла
fzero
иfor
), или это уравнение с несколькими переменными (обычно они не имеют четко определенных корней и должны решаться с помощью методов оптимизации). , например,fsolve
)? 23.01.2017 - Это набор уравнений с несколькими переменными; эти уравнения независимы. 23.01.2017
- Попробуйте
fsolve
. Не могу сказать больше без конкретного примера. 23.01.2017
Ответы:
В наборе инструментов оптимизации Matlab есть метод fsolve, в котором указано, что он способен:
Решает проблему, заданную
F(x) = 0
дляx
, гдеF(x)
– это функция, возвращающая векторное значение. x является вектором или матрицей.
В противном случае можно найти нули общей векторной функции, пытаясь минимизировать норму векторного выхода. Предположим, ваша функция F(x)
выводит вектор Nx1
. Вы можете попытаться найти ноль, выполнив следующие действия:
y = fminunc(@(x) sum(F(x).^2));
or
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, точку разрыва в тангенсе.
Кроме того, команда 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);
Не могу проверить это прямо сейчас, я отредактирую это решение чуть позже.
fsolve(f,x0)
по сетке начальных предположений. Но есть ли лучший (более эффективный) способ их найти? 24.01.2017