Maple 9.5/10 в математике, физике и образовании - Владимир Дьяконов
Шрифт:
Интервал:
Закладка:
> restart;
> р:=а4*х^4+a3*х^3+а2*х^2;
р:=а4 х4 + a3 x3 + а2 х2> degree(р,х);
4> ldegree(р,х);
2> q:=1/х^2+2/х+3+4*х+5*х^2;
> degree(q,х);
2> ldegree(q,х);
-2> degree(x*sin(x),x);
FAIL> zero := y*(x/(x+1)+1/(x+1)-1);
> degree(zero,x);degree(zero, y);
FAIL 1> degree(collect(zero,x,normal),x);degree(collect(zero,y, normal),y);
-∞ -∞5.3.5. Контроль полинома на наличие несокращаемых множителей
Для контроля того, имеет ли полином несокращаемые множители, может использоваться функция irreduc(p) и ее вариант в инертной форме lreduc(p,K), где K — RootOf-выражение. Ниже приведены примеры применения этих тестовых функций:
> irreduc(х^2-1);
false> irreduc(х^2-2);
true> Irreduc(2*x^2+6*x+6) mod 7;
false> Irreduc(x^4+x+1) mod 2;
true> alias(alpha=RootOf(x^4+x+1)):
> Irreduc(х^4+х+1,alpha) mod 2;
false5.3.6. Разложение полинома по степеням
Для разложения полинома р по степеням служат инертные функции AFactor(p) и AFactors(p). Полином может быть представлен в виде зависимости от одной или нескольких переменных.
Функция Afactor(p) выполняет полную факторизацию (разложение) полинома p от нескольких переменных с коэффициентами в виде алгебраических чисел над полем комплексных чисел. При этом справедливо отношение evala(AFactor(p))= factor(p.complex). Таким образом, эта функция является, по существу, избыточной.
В случае одномерного полинома полное разложение на множители является разложением на линейные множители. Функция AFactors аналогична функции Afactor, но создает структуру данных формы [u,[[f[1],e[1]],…,[f[n],e[n]]]] так, что p=u*f[1]^e[1]*…*f[n]^e[n], где каждый f[i] — неприводимый полином.
Ниже даны примеры применения функции Afactor:
> evala(AFactor(2*х^2+4*х-6));
2(x+3)(х-1)> evala(AFactor(х^2+2*у^2));
(х - RootOf(_Z² + 2)y) (x + RootOf(_Z² + 2)y)> expand((x-1) * (x-2) * (x-3) * (x-4));
x4 - 10 x3 + 35 x2 - 50 x + 24> AFactor(%);
AFactor(x4 - 10 x3 + 35 x2 - 50 x + 24)> evala(%);
(x-1)(x-2)(x-3)(x-4)> expand((x-1+I*2)*(x+1-I*2)*(x-3));
x³ - 3x² + 3x - 9 + 4 I x-12 I> evala(AFactor(%));
(x - 3)(x² + 3 + 4I)> evala(AFactors(х^2-2*у^2));
[1, [[x - RootOf(_Z² - 2)y, 1], [x + RootOf(_Z² + 2)y, 1]]]Нетрудно заметить, что разложение полинома на множители позволяет оценить наличие у него корней. Однако для этого удобнее воспользоваться специальными функциями, рассмотренными ниже.
5.3.7. Вычисление корней полинома
Для вычисления действительных и комплексных корней полиномов служит уже известная нам функции solve(p, x), возвращающая список корней полинома p одной переменной. Кроме того, имеются следующие функции для вычисления корней полиномов:
roots(р)
roots(р, K)
roots(р, х)
roots(р, x, K)
Эти функции вычисляют точные корни в рациональной или алгебраической области чисел. Корни возвращаются в виде [[r1,m1], [rn, mn]], где mi — это корень полинома, a mi — порядковый номер полинома. С действиями этих функций можно разобраться с помощью приведенных ниже примеров:
> р:=х^4 1-9*х^3+31*х^2+59*х+60;
р:=х4 + 9х3 + 31х2 + 59 х + 60> solve(р,х);
-3, -4, -1 + 2I, -1-2I> roots(р,х);
[[-4, 1], [-3, 1]]> roots(х^2-4,х);
[[2, 1], [-2, 1]]> expend((х-1)*(х-2)*(х-3)*(х-4));
х4 -10х3 +35х2 - 50 х + 24> roots(%,х);
[[1, 1], [2, 1], [3, 1], [4, 1]]5.3.8. Основные операции с полиномами
С полиномами могут выполняться различные операции. Прежде всего, отметим некоторые функции, которые относятся к одному полиному:
psqrt(p) — возвращает квадрат полинома;
proot(p,n) — возвращает n-ю степень полинома;
realroot(p) — возвращает интервал, в котором находятся действительные корни полинома;
randpoly(vars, eqns) — возвращает случайный полином по переменным vars (список) с максимальной степенью eqns;
discrim(p, var) — вычисление дискриминанта полинома по переменной var;
Primitive(a) mod p — проверка полинома на примитивность (возвращает true, если полином примитивен).
Действие этих функций достаточно очевидно, поэтому ограничимся приведением примеров их использования (файл polop):
> psqrt(х^2+2*х*у+у^2);
у + x> proot(х^3+3*х^2+3*х+1, 3);
x+1> psqrt(x+y);
_NOSQRT> proot(x+y, 2);
_ NOROOT> р:=х^3-3*х^2+5*х-10;
p:=x³ - 3x² + 5x - 10> discrim(p,x);
-1355> readlib(realroot):
> realroot(p);
[[0, 4]]> randpoly([x],degree=10);
63x10 + 57x8 - 59x5 + 45x4 - 8x3 - 93> randpoly([x],degree=10);
-5x9 + 99x8 - 61x6 - 50x5 - 12x3 - 18x> randpoly([x],degree=10);
41x9 - 58x8 - 90x7 + 53x6 - x4 + 94x> Primitive(х^4+х+1) mod 2;
trueОбратите внимание на то, что для использования некоторых из приведенных функций необходим вызов их из стандартной библиотеки. Для функции randpoly приведенные результаты случайны, так что, скорее всего, их повторение невозможно.
С полиномами можно выполнять обычные операции, используя для этого соответствующие операторы:
> readlib(psqrt):
> readlib(proot):
> Primitive(х^4+х+1) mod 2;
true> p1:=a1*x^3+b1*x^2+c1*x+d1: p2:=а2*х^2+b2*х+с2:
> p1+p2;
a1х³ + b1х² + c1x + d1 + a2x² + b2х + с2> p1*p2;
(a1x³ + b1x² + c1x + d1) + (a2x² + b2х + с2)> collect(%,х);
a1a2x5 + (b1а2 + а1b2)х4 + (c1a2 + b1b2 + а1с2)х3 + (d1a2 + c1b2 + b1с2)х2 + (d1b2 + c1c2)x + d1c2> p1/p2;
> expand(%,х);
В целом надо отметить, что аппарат действий с полиномами в Maple хорошо развит и позволяет выполнять с ними практически любые математические операции. В частности, можно вычислять производные от полиномов и интегралы, у которых полиномы являются подынтегральными функциями:
> diff(p1, х);
3а1х² + 2b1х + c1> diff(p1, x$2);
6a1x + 2b1> Int(p1,x)=int(p1,x);
> Int(p1,х=0..1)=int(p1,х=0..1);
5.3.9. Операции над степенными многочленами с отрицательными степенями
Хотя в подавляющем большинстве случаев используются степенные многочлены (полиномы) с положительными степенями, Maple не накладывает особых ограничений и на многочлены с отрицательными степенями. Например, можно задать такой степенной многочлен:
> pp:=а*х^(-2)+b*x^(-1)+c*x+d+e*x^2+f*х^3;
Нетрудно показать, что с ним можно выполнять различные операции:
> рр+рр;
> рр-рр;
0> pp^2
> simplify(%);
> Diff(pp, x)=diff(pp, x)
> Int(pp,x);
> int(рр,х);
Хотя Maple и не накладывает ограничений на применение степенных многочленов (полиномов) с отрицательными степенями свойства таких полиномов заметно отличаются от свойств полиномов с положительными степенями, поэтому при применении первых надо проявлять известную осторожность.
5.4. Работа с ортогональными полиномами
5.4.1. Состав пакета orthopoly
Ортогональные многочлены (полиномы) находят самое широкое применение в различных математических расчетах. В частности они широко используются в алгоритмах интерполяции, экстраполяции и аппроксимации различных функциональных зависимостей, где свойство ортогональности обеспечивает оценку погрешности приближения и сведение ее к минимуму — вплоть до нуля.
В пакете orthopoly системы Maple 9.5 задано 6 функций:
> with(orthopoly);
[G, Н, L, Р, Т, U]Однобуквенные имена этих функций отождествляются с первой буквой в наименовании ортогональных полиномов. Вопреки принятым в Maple правилам, большие буквы в названиях этих полиномов не указывают на инертность данных функций — все они являются немедленно вычисляемыми. В данном разделе функции этого пакета будут полностью описаны.
Отметим определения указанных функций:
G(n,a,x) — полином Гегенбауэра (из семейства ультрасферических полиномов);