числовой::
Числовой поиск действительного корня действительной одномерной функции
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
numeric::realroot(f(x
), x = a .. b
, <SearchLevel = s
>)
numeric::realroot(f(x), x = a..b)
вычисляет числовой действительный корень f (x) в интервале [a, b].
f(x)
выражения не должен содержать символьные объекты кроме неопределенного x
, который не может быть преобразован в численные значения через float
. И т.д. приняты символьные объекты, такие как π или. То же самое сохраняется для контуров a, b
поискового интервала.
Функция должна произвести действительные значения. Если float(f(x))
не приводит к действительным числам с плавающей запятой для всех действительных чисел с плавающей запятой x
от интервала, могут произойти внутренние проблемы. Смотрите Пример 5.
numeric::realroot
никогда не пытается оценить f(x)
вне поискового интервала. Следовательно, особенности вне интервала не вызывают проблем. Во многих случаях также особенности в интервале не влияют на числовой поиск. Однако numeric::realroot
, как гарантируют, не будет работать в таком случае. Ошибка может произойти, если внутренний поиск случайно поражает особенность. Смотрите Пример 5.
Чтобы округлить эффекты числовые корни r с вычисляются к относительной точности DIGITS
значительные десятичные разряды. Корни меньшего абсолютного размера вычисляются к абсолютной точности. Эти цели точности не достигаются, если значительное округление происходит в численной оценке f (x).
Если f берет противоположные знаки в конечных точках a, b поискового интервала и не имеет особенностей пересечения нулем, то numeric::realroot
обязан найти корень в интервале.
Могут быть обработаны определяемые пользователем функции. Смотрите Пример 2.
numeric::realroot
аппроксимирует точку, где f(x)
изменяет свой знак. Это - корень, только если функциональный f
непрерывен. Смотрите Пример 3.
Обратите внимание на то, что numeric::realroots
может использоваться, чтобы изолировать все действительные корни. Однако эта функция намного медленнее, чем numeric::realroot
, если f не является полиномом.
Для одномерных полиномов мы рекомендуем использовать numeric::realroots
или polylib::realroots
, а не numeric::realroot
.
Функция чувствительна к переменной окружения DIGITS
, который определяет числовую рабочую точность.
Следующие функции принимают различные знаки на контурах, таким образом, поисковые запросы обязаны успешно выполниться:
numeric::realroot(x^3 - exp(3), x = -PI..10)
numeric::realroot(exp(-x[1]) = x[1], x[1] = 0..1)
Следующая функция не может быть выполнена для нечислового x
. Таким образом, нужно задержать оценку через hold
:
f := proc(x) begin if x<0 then 1 - x else exp(x) - 10*x end_if end_proc: numeric::realroot(hold(f)(x), x = -10..10)
delete f:
numeric::realroot
аппроксимирует точку, где f (x) изменяет свой знак. Для следующей функции это происходит в разрыве x = 1:
f := proc(x) begin if x<1 then -1 else x end_if end_proc: numeric::realroot(hold(f)(x), x = 0..3)
delete f:
Следующая функция не имеет действительного корня. Следовательно, сбои numeric::realroot
:
numeric::realroot(x^2 + 1, x = -2..2)
Следующая функция не имеет действительного корня в поисковом интервале:
numeric::realroot(x^2 - 1, x = 2..3)
Следующая функция комплексная оцененный за x 2 <3.5. Ошибка происходит, когда внутренний поиск поражает такую точку:
numeric::realroot(ln(x^2 - 3.5), x = -2..3)
Error: Unable to evaluate to Boolean. [_less] Evaluating: numeric::BrentFindRoot
Особенность в x = 1 не вызывает проблемы в следующем вызове:
numeric::realroot((x-2)/(x-1), x = -10..10)
Однако особенность может быть поражена случайно во внутреннем поиске:
numeric::realroot((x-2)/(x-1), x = 0..3)
Error: Division by zero. [_power] Evaluating: f
Следующая функция имеет корень близко к 1,0, который трудно обнаружить. С поисковым уровнем по умолчанию s = 1, не найден этот корень:
f := 2 - exp(-100*(x - 2)^2) - 2*exp(-1000*(x - 1)^2): numeric::realroot(f, x = 0..5)
Корень обнаруживается с увеличенным поисковым уровнем:
numeric::realroot(f, x = 0..5, SearchLevel = 3)
delete f:
|
Арифметическое выражение в одном неизвестном |
|
Идентификатор или индексируемый идентификатор |
|
Конечные действительные численные значения |
|
Опция, заданная как Неотрицательный целочисленный s управляет внутренним улучшением поиска. Значением по умолчанию является s = 1. Увеличение s увеличивает шанс нахождения корней, которые трудно обнаружить численно. Смотрите Пример 6. Обратите внимание на то, что увеличение s 1 может увеличить время в четыре раза, прежде чем |
Один числовой действительный корень доменного типа DOM_FLOAT
. Если никакое решение не найдено, то FAIL
возвращен.
Смесь bisectioning, секущих шагов и квадратичной интерполяции используется numeric::realroot
.