polylib::realroots

Изолируйте все действительные корни действительного одномерного полинома

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.

Синтаксис

polylib::realroots(p)
polylib::realroots(p, eps)

Описание

polylib::realroots(p) возвращает интервалы, изолирующие действительные корни действительного одномерного полиномиального p.

polylib::realroots(p, eps) возвращает усовершенствованные интервалы, аппроксимирующие действительные корни p к относительной точности, данной eps.

Все коэффициенты p должно быть действительным и числовым, т.е. или целые числа, rationals или числа с плавающей запятой. Числовые символьные объекты, такие как sqrt(2), exp(10*PI) и т.д. приняты, если они могут быть преобразованы в действительные числа с плавающей запятой через float. То же самое содержит для цели точности eps.

Интервалы изоляции упорядочены таким образом, что их центры увеличиваются, т.е. a i + b i <a i + 1 + b i + 1.

Номер nops(realroots(p)) из интервалов количество действительных корней p. Несколько корней считаются только однажды. См. Пример 3.

Изоляция интервалов может быть довольно большой. Дополнительный аргумент eps может использоваться, чтобы совершенствовать интервалы, таким образом, что они аппроксимируют действительные корни к относительной точности eps. С этим аргументом удовлетворяют возвращенные интервалы, т.е. каждый центр аппроксимирует корень относительной точностью eps/2.

Примечание

Некоторую заботу нужно соблюдать при попытке получить очень точные приближения корней через маленькие значения eps. Внутренне, bisectioning с точной рациональной арифметикой используется, чтобы определить местоположение корней к точности eps. Этот процесс может занять намного больше времени, чем определение интервалов изоляции, не используя второй аргумент eps в polylib::realroots. Это может быть быстрее, чтобы использовать умеренные значения eps получить первые приближения корней через polylib::realroots. Эти приближения могут затем быть улучшены быстрым числовым решателем, таким как numeric::fsolve с соответственно высоким значением DIGITS. См. Пример 6. Однако отметьте тот polylib::realroots будет всегда преуспевать в том, чтобы определить местоположение корней к желаемой точности в конечном счете. Числовые решатели могут привести к сбою или возвратить корень, не принадлежащий интервалу, который использовался в начальном приближении.

Примечание

Неожиданные результаты могут быть получены, когда полином содержит иррациональные коэффициенты. Внутренне, любой такой коэффициент c преобразован в число с плавающей запятой. Это плавание затем заменяется рациональным числом аппроксимации удовлетворение r. Наконец, polylib::realroots возвращает строгие границы для действительных корней рационализированного полинома. Несмотря на то, что все коэффициенты аппроксимированы правильно к DIGITS десятичные разряды это может изменить корни решительно. В частности, несколько корней или кластеров плохо разделенных простых корней очень чувствительны к небольшим возмущениям в коэффициентах полинома. Смотрите Пример 4 и Пример 5.

Взаимодействия среды

Функция чувствительна к переменной окружения DIGITS, если существует нецелое число или нерациональные коэффициенты в полиноме. Любой такой коэффициент заменяется рациональным числом, аппроксимирующим коэффициент к DIGITS значительные десятичные разряды.

Примеры

Пример 1

Мы используем многочленное выражение в качестве входа к polylib::realroots:

p := (x - 1/3)*(x - 1)*(x - 4/3)*(x - 2)*(x - 17):
polylib::realroots(p)

Корни 1 и 2 найдены точно: соответствующие интервалы имеют длину 0. Другие интервалы изоляции являются довольно большими. Мы совершенствовали интервалы, таким образом, что они аппроксимируют корни к 12 десятичным разрядам. Обратите внимание на то, что это независимо от текущего значения DIGITS, потому что никакая арифметика с плавающей точкой не используется:

polylib::realroots(p, 10^(-12))

Мы преобразуем эти точные границы для действительных корней к приближениям с плавающей точкой. Обратите внимание на то, что со значением по умолчанию DIGITS=10 мы игнорируем 2 из 12 правильных цифр, которые могли потенциально дать рациональные границы:

map(%, map, float)

delete p:

Пример 2

Ортогональные полиномы степени n имеют n простые действительные корни. Мы считаем Полином лежандра степени 5, доступным в библиотеке orthpoly для ортогональных полиномов:

polylib::realroots(orthpoly::legendre(5, x), 10^(-DIGITS)):
map(%, float@op, 1)

Пример 3

Мы рассматриваем полином с корнем кратного:

p := poly((x - 1/3)^3*(x - 1), [x])

Обратите внимание на то, что только один интервал изоляции [0, 1] возвращен для тройного корня:

polylib::realroots(p)

delete p:

Пример 4

Мы рассматриваем полином с нерациональными корнями:

p := (x - 3)^2*(x - PI)^2:

Преобразование результата polylib::realroots к числам с плавающей запятой каждый видит что точные корни 3, 3, PI, PI аппроксимированы только к 3 десятичным разрядам:

map(polylib::realroots(p, 10^(-10)), map, float)

Это вызывается внутренней рационализацией коэффициентов p.

Интервалы возвращены polylib::realroots(p, 10^(-10)) правильно найдите 4 точных корня этого рационализированного полинома к точности 10 цифр. Однако, потому что все 4 корня близки, небольшие возмущения коэффициентов, введенных рационализацией, оказывают решительное влияние на местоположение корней. В частности, рационализация разделяет два исходных двойных корня в 4 простых корня.

delete p:

Пример 5

Мы считаем дальнейший пример включающими неточными коэффициентами. Сначала мы аппроксимируем корни полинома с точными коэффициентами:

p1 := (x - 1/3)^3*(x - 4/3):
map(polylib::realroots(p1, 10^(-10)), map, float)

Теперь мы вводим ошибки округления, заменяя одну запись приближением с плавающей точкой:

p2 := (x - 1.0/3)^3*(x - 4/3):
map(polylib::realroots(p2, 10^(-10)),map,float)

В этом примере рационализация вызвала тройной корневой 1/3 разделять в один действительный корень и два комплексно-сопряженных корня.

delete p1, p2:

Пример 6

Мы хотим аппроксимировать корни к точности 1 000 цифр:

p := x^5 - 129/20*x^4 + 69/5*x^3 - 14*x^2 + 12*x - 8:

Мы рекомендуем не получить результат непосредственно polylib::realroots(p,10^(-1000)), потому что внутренний bisectioning процесс для совершенствования грубой изоляции интервалов сходится только линейно. Вместо этого мы вычисляем первые приближения корней к точности 10 цифр:

approx := map(polylib::realroots(p, 10^(-10)), float@op, 1)

Эти значения используются в качестве начальных точек для числового корневого средства поиска. Внутренний Ньютон ищет в numeric::fsolve сходится квадратично и уступает, высокая точность заканчивается намного быстрее, чем polylib::realroots:

DIGITS := 1000:
roots := map(approx, x0 -> numeric::fsolve([p = 0], [x = x0]))
[[x = 1.489177598846870281338916114673844643894...],
      [x = 1.752191733304413195335101727880090131407...],
      [x = 3.255184555797733438479691333705558491124...]]
delete approx, DIGITS, roots, x0:

Параметры

p

Одномерный полином: или выражение или polyomial доменного типа DOM_POLY.

eps

(Небольшое) положительное вещественное число, определяющее размер возвращенных интервалов.

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

Список списков [[a 1, b 1], [a 2, b 2], …] с рациональными числами a ib i возвращен. Списки с a i = b i представляют точные рациональные корни. Списки с a i <b i представляют открытые интервалы, содержащие точно один действительный корень. Если полином не имеет никаких действительных корней, то пустой список [ ] возвращен.

Смотрите также

Функции MuPAD