numeric::realroot

Числовой поиск действительного корня действительной одномерной функции

Блокноты 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, который определяет числовую рабочую точность.

Примеры

Пример 1

Следующие функции принимают различные знаки на контурах, таким образом, поисковые запросы обязаны успешно выполниться:

numeric::realroot(x^3 - exp(3), x = -PI..10)

numeric::realroot(exp(-x[1]) = x[1], x[1] = 0..1)

Пример 2

Следующая функция не может быть выполнена для нечислового 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:

Пример 3

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:

Пример 4

Следующая функция не имеет действительного корня. Следовательно, numeric::realroot сбои:

numeric::realroot(x^2 + 1, x = -2..2)

Следующая функция не имеет действительного корня в поисковом интервале:

numeric::realroot(x^2 - 1, x =  2..3)

Пример 5

Следующая функция комплексная оцененный за 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

Пример 6

Следующая функция имеет корень близко к 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:

Параметры

f(x)

Арифметическое выражение в одном неизвестном x или список, набор, array, или matrix (Cat::Matrix) из выражений. В качестве альтернативы уравнения в форме f1(x) = f2(x) эквивалентный выражениям f1(x) - f2(x).

x

Идентификатор или индексируемый идентификатор

aB

Конечные действительные численные значения

Опции

SearchLevel

Опция, заданная как SearchLevel = s

Неотрицательный целочисленный s управляет внутренним улучшением поиска. Значением по умолчанию является s = 1. Увеличение s увеличивает шанс нахождения корней, которые затрудняют, чтобы обнаружить численно. Смотрите Пример 6.

Обратите внимание на то, что увеличение s 1 может увеличить время в четыре раза перед FAIL возвращен, если никакой действительный корень не найден. Поэтому мы рекомендуем ограничить s маленькими значениями (s ≤ 5, сказать).

Возвращаемые значения

Один числовой действительный корень доменного типа DOM_FLOAT. Если никакое решение не найдено, то FAIL возвращен.

Алгоритмы

Смесь bisectioning, секущих шагов и квадратичной интерполяции используется numeric::realroot.