Разложение рациональной дроби на простейшие. — страница 8

  • Просмотров 15625
  • Скачиваний 637
  • Размер файла 9
    Кб

коэффициентов установим в значение 1 (следующий, не использованный индекс). Далее, пробегая по списку ds знаменателей будущих простейших дробей, анализируем их степень. Собственно сама реализация такого анализа (а) может показаться довольно странной. Со встроенной функцией degree все понятно — она возвратит степень многочлена относительно переменной, переданной в качестве второго параметра. Что же значит запись op(1, op(i, ds))? Так как

вариантов здесь только два, то их и рассмотрим. Если op(i, ds) — выражение вида (x 2 +bx+c) n либо (x+d) n , то op(1, op(i, ds)) вернет то, что находится в скобках. В другом случае — x 2 +bx+c либо x+d (скобок нет) — такая композиция возвратит высший член многочлена (он записан в лексикографическом виде). Таким образом реализуется определение степени знаменателя без учета кратности . А дальше, в зависимости от этого формируется числитель степени на единицу

меньшей. За что люблю Maple, так это за (б) и (в) . Ну где вы видели, чтоб вот так “на ходу” можно было “собрать” переменную? А здесь возможно и такое. Естественно, использовав очередной индекс, необходимо увеличить значение счетчика. Итак, нечто весьма похожее на разложение, приведенное в теореме, мы получили. Теперь дело за малым — нужно вычислить эти самые A k -ые. Сделаем это так: приведем полученное разложение к общему знаменателю,

разберемся с подобными и соберем коэффициенты перед x i , где i = 0 ... 21 (в нашем случае) в числителе: > f:= collect(numer(rxn), x): > for i from 0 to degree(f, x) do > cundef[i]:= coeff(f, x, i): > od: Функция numer , вернув числитель, “по дороге” приведет rxn к общему знаменателю, collect как раз и повыносит за скобки x i . В переменные (не массив!) cundef i выделим с помощью функции coeff (третий параметр — степень переменной, остальные два очевидны) эти самые коэффициенты. Их количество

будет равно степени f плюс один (нулевая). Зачем это надо? А что у нас во fracpart? Именно — то же самое, но коэффициенты определенные. Что делаем? Составляем систему линейных уравнений и решаем относительно наших A k -ых. Единственность решения такой системы доказана до нас, посему спокойно пишем дальше: > b:= collect(fracpart, x): (а) > for i from 0 to degree(f, x) do > cdef[i]:= coeff(b, x, i): > od: Снова собрали в cdef i коэффициенты при x i , но уже из fracpart (определенные).

Внимание на (а) — их должно быть столько же, сколько и в первом наборе, иначе система не получится. Сформируем набор переменных ( A k- ые), относительно которых будем решать нашу систему и ее саму: > vars:= {seq(A[k], k=1..lastvar-1)}: > eqns:= {seq(cundef[i]=cdef[i], i=0.. degree(f, x))}: > assign(solve(eqns, vars)); Последняя строка заставит Maple пошевелить мозгами, решить нашу систему относительно наших переменных. Функция solve требует два параметра: первый — это набор уравнений,