Есть ли какая-либо функция в MATLAB, которая может найти нули вектор-функции? Обычно используемая функция fzero
предназначена только для скалярных функций, а также не может найти нули любой скалярной функции, такой как f(x)=x^2
.нули векторной функции
ответ
оптимизации инструментов MatLab имеет в fsolve method, что государства способен:
Решает проблему, указанный
F(x) = 0
дляx
, гдеF(x)
является функцией, которая возвращает значение вектора а. 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
«s был раздел с его ограничениями, сказал
Команда fzero находит точку, где функция меняет знак. Если функция непрерывна, это также точка, где функция имеет значение около нуля. Если функция не является непрерывной, fzero может возвращать значения, которые являются прерывистыми точками вместо нулей. Например, fzero (@ tan, 1) возвращает 1.5708, прерывистую точку в tan.
Кроме того, команда fzero определяет нуль как точку, где функция пересекает ось x. Точки, в которых функция касается, но не пересекается, ось х - это недопустимые нули. Например, y = x.^2 - парабола, которая касается оси x в точке 0. Так как функция никогда не пересекает ось x, то нигде не найдено. Для функций без допустимых нулей fzero выполняется до тех пор, пока не обнаружено Inf, NaN или комплексное значение.
Спасибо за ваш ответ. Просто еще один вопрос. Если система нелинейных уравнений допускает более одного решения; как мы можем найти их все. Типичным способом является запуск 'fsolve (f, x0)' на сетке исходных догадок. Но есть ли лучший (более эффективный) способ их найти? –
@SaraWinslet, я не знаю других, более эффективных методов, помимо того, что вы сказали, чтобы найти несколько решений. И даже использование сетки исходных догадок не гарантирует, что вы найдете все решения. – lucianopaz
Может быть, я неправильно что-то в вашем вопросе, но вы можете попробовать это решение:
y = @(x) x^2;
fminbnd(y, -100, 100)
ans = -3.5527e-15
А может быть, вы можете попробовать solve
:
syms x y
y = @(x) x^2;
solve(y==0, x);
Не можете проверить это прямо сейчас, я буду отредактируйте это решение немного позже.
У меня есть набор уравнений, а не только одно уравнение. –
Чтобы уточнить, является ли это набор независимых уравнений, которые вы хотите решить вместе (обычно это делается с помощью 'fzero' и' for' loop) или это многопараметрическое уравнение (они, как правило, и должны решаться с помощью методов оптимизации, например, 'fsolve')? – horchler
Это набор многопараметрических уравнений; эти уравнения независимы. –
Попробуйте 'fsolve'. Не могу сказать больше без конкретного примера. – horchler