Читайте данную работу прямо на сайте или скачайте

Скачайте в формате документа WORD


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

Федеральное агентство по образованию

Государственное общеобразовательное чреждение

высшего профессионального образования

Башкирский Государственный ниверситет

Нефтекамский филиал

Кафедра МиПОВМ

Курсовая работа

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

Выполнил студент

группы М-31

Остапов А. Б.

Принял:

Вильданов А. Н.

Нефтекамск 2006


Содержание.

        Введение.

        Часть 1. Теоретическая часть к курсовой работе.

        Часть 2. Практическая часть к курсовой работе.

o   з Реализация метода простых коэффициентов в MapleФ.

o   з Реализация метода простых коэффициентов на DelphiФ.

        Заключение.

        Список литературы.


Введение.

Этот вопрос же много раз изучен и рассмотрен. Казалось бы, что может быть проще для современного математика, чем разложить рациональную дробь на простейшие, разве что элементарные алгебраические операции. Однако, применение этого метода существенно облегчает жизнь - не будь метода - некоторые задачи было бы очень проблематично решить, некоторые вообще не решались.

Основные операции, в которых я применял этот метод, были:

) Разложение рациональной дроби на простейшие с целью дальнейшего интегрирования получившихся элементарных дробей (Матем. анализ);

б) Разложение рациональной дроби на простейшие для использования в процессе преобразования Лапласа, что иногда серьезно скоряет нахождение решения различных равнений и систем равнений в частных производных (Курс равнений мат. физики).

Разложение - это необходимость. Без нее нельзя обходиться, тем более на современном этапе развития математической мысли. Об этом и пойдет речь в моей курсовой работе.


Часть 1.

Теоретическая часть к курсовой работе.

Рациональной дробью назовем отношение двух алгебраических многочленов с вещественными коэффициентами:

Дробь называется правильной, если степень P(x) меньше степени Q(x), и неправильной в противном случае. Простейшей называется правильная дробь, знаменатель которой представляет собой неприводимый (значит не имеющий корней) над некоторым полем (в нашем случае - поле действительных чисел) многочлен.

Для простых (правильных) дробей с действительными коэффициентами справедлива следующая теорема о разложении на сумму простейших:

Пусть (1) Ч правильная рациональная дробь с действительными коэффициентами, знаменатель которой имеет вид:



тогда для этой дроби справедливо следующее разложение на сумму простейших дробей:

где индексированные переменные B, M, N - некоторые вещественные постоянные (может быть, равные нулю).

Для определения конкретных значений сих коэффициентов следует привести равенство к общему знаменателю и сравнить коэффициенты при одинаковых степенях x в числителе. Т.е. по сути дела решить систему линейных уравнений. Используется эта конструкция по большей части при вычислении интегралов, т.к. таким образом интеграл произвольной рациональной функции сводится, по сути дела, к сумме табличных интегралов.

Рациональной дробью R(x) называется дробь, числителем и знаменателем которой являются многочлены, т. Е. всякая дробь вида:

Если степень многочлена в числителе больше или равна степени многочлена в знаменателе (n≥m), то дробь называется неправильной. Если степень многочлена в числителе меньше степени многочлена в знаменателе (n≤m), то дробь называется правильной.

Всякую неправильную рациональную дробь можно представить в виде суммы многочлена (целой части) и правильной рациональной дроби (это представление достигается путем деления числителя на знаменатель по правилу деления многочленов):

где R(x) - многочлен-частное (целая часть) дроби Pn(x) - остаток (многочлен степени n < m).

Интегрирование простейших дробей. Простейшей дробью называется правильная рациональная дробь одного из следующих четырех типов:

1)

2) а(n≥2);

3)

4) а(n≥2).

Здесь А, a, p, q, M, N - действительные числа, трехчлен не имеет действительных корней, т. е. p2/4-q < 0.

Простейшие дроби первого и второго типов интегрируются непосредственно с помощью основных правил интегрального исчисления:

Интеграл от простейшей дроби третьего типа приводится к табличным интегралам путем выделения в числителе дифференциала знаменателя и приведения знаменателя к сумме квадратов:

Интегрирование рациональных дробей.

Разложение рациональной дроби на простейшие дроби. Всякую правильную рациональную дробь аможно представить в виде суммы конечного числа простейших рациональных дробей первого - четвертого типов. Для разложения ана простейшие дроби необходимо разложить знаменатель Qm(x) на линейные и квадратные множители, для чего надо решить равнение:

а- (5)

Теорема. Правильную рациональную дробь где можно единственным образом разложить на сумму простейших дробей:

а- (6)

(A1, A2, Е, Ak, B1, B2, Е, B1, M1, N1, M2, M2, Е, Ms, Ns - некоторые действительные числа).

Метод неопределенных коэффициентов. Суть метода неопределенных коэффициентов состоит в следующем. Пусть дано разложение правильной рациональной дроби апо формуле (6) на простейшие дроби с неопределенными коэффициентами. Приведем простейшие дроби к общему знаменателю Qm(x) и приравняем многочлен, получившийся в числителе, многочлену Pn(x).

Метод частных значений. При нахождении неопределенных коэффициентов вместо того, чтобы сравнивать коэффициенты при одинаковых степенях х, можно дать переменной х несколько частных значений (по числу неопределенных коэффициентов) и получить таким образом систему равнений относительно неопределенных коэффициентов. Особенно выгодно применять этот метод в случае, корни знаменателя рациональной дроби апросты и действительны. Тогда оказывается добным последовательно полагать равным каждому из корней знаменателя.

Правило интегрирования рациональных дробей. Для того чтобы проинтегрировать рациональную дробь, необходимо выполнить следующие действия:

1)                     если рассматриваемая рациональная дробь а- неправильная (k≥m), представить ее в виде суммы многочлена и правильной рациональной дроби:

где n < m; R(x) - многочлен;

2)                     если рассматриваемая рациональная дробь а- правильная (n < m), представить ее в виде суммы простейших рациональных дробей по формуле (6);

3)                     интеграл от рациональной дроби представить в виде суммы интегралов от целой части и от соответствующих простейших дробей и вычислить эти интегралы.

Интегрирование дробно-рациональных функций.

Пусть и некоторые полиномы степени m и n

Функция вида

называется дробно-рациональной функцией , или коротко-рациональной дробью.

При m<n эта рациональная дробь называется правильной.

Интегралы от дробно Црациональных функций всегда вычисляются. Однако мы не будем рассматривать полную теорию интегрирования таких функций, рассмотрим только два наиболее важных частных случая

Случай 1 Подынтегральная функция имеет вид

,

где все различны и m<n, т.е. рациональная дробь является правильной .

Основной результат который мы приведём без доказательства, тверждает, что f(x) в этом случае можно представить в виде:

Слагаемые вида называются простейшими, само приведённое разложение называется Уразложением рациональной дроби на простейшие.

Рассмотрим вопрос о нахождении коэффициентов . Рассмотрим, например, вычисления . Для этого

) множим обе части разложения на простейшие на

б) И положим x=b1. Так как при этом (x-b1)=0, то получи

(символ означает, что в написанном слева выражении надо положить )

налогично можно найти и все остальные . Этот метод получил название метода вычёркивания У. Он формулируется так : чтобы вычислить коэффициент нужно

) в выражении для f(x) вычеркнуть сомножитель

б) в оставшемся выражении положить .

Если все найдены, то дальнейшее очень просто

и получившиеся интегралы 1 типа легко вычисляются

Пример: Вычислить

) Разложим подынтегральную функцию на простейшие. Имеем

Поэтому

б)Интегрируем

а

Случай 2. Подынтегральная функция имеет вид

т.е. сомножитель вида даёт группу слагаемых вида

Если теперь найти все коэффициенты Bij а, то метод разложения приведёт к интегралам 1 и 2 типов которые легко вычисляются.

Для нахождения коэффициентов Bij можно использовать так называемый метод неопределённых коэффициентов.

Его алгоритм следующий.

) пишут разложение рациональной дроби на простейшие с неопределёнными коэффициентами ;

б) написанное разложение на простейшие приводят к общему знаменателю и вновь сворачивают в правильную рациональную дробь ;

в) приравнивают коэффициенты при одинаковых степеняха x в числителях исходной дроби и получившейся дроби;

г) решают полученную систему линейных уравнений и определяют Bij.

Продемонстрируем этот метод на примере.

Пример. Вычислить.

продемонстрируем алгоритм по пунктам

) пишем разложение на простейшие с неопределёнными коэффициентами

б) приводим разложение на простейшие к общему знаменателю.

и раскрываем получившийся в числителе полином

в) сравнивая коэффициенты при одинаковых степенях x аy исходной функции и получившегося выражения, получим

Решая эту систему, получим

A=2 B=3 C=-1 D=2

так что

г) интегрируем

Комбинированный метод

Метод неопределённых коэффициентов достаточно трудоёмок.Однако заметим что коэффициенты при старших степенях , т.е. при можно определять методом вычёркивания.

Поэтому реально комбинируют оба этих метода :коэффициенты при определяют методом вычёркивания, оставшиеся - методом неопределённых коэффициентов.

Пример. В том же самом примере

находим

так что

,

приводя к общему знаменателю получим

.

Случай 3. Подынтегральная функция имеет вид

Разложение этой функции на простейшие имеет вид.

т.е. от сомножителя идёт слагаемое вида . Оно при интегрировании даст интеграл третьего типа.

Коэффициенты при старших степенях , т.е. при находятся методом вычёркивания, остальные - методом неопределённых коэффициентов.

Пример. Вычислить

Так как , то

находим методом вычёркивания

N и M находим методом неопределённых коэффициентов

Так как это должно быть равно то имеем

при и при )

Отсюда

(В последнем интеграле N=2, M=1, p=1, q=1).

Общий случай правильной рациональной дроби мы рассматривать не будем.

В заключение отметим, что есть рациональная дробь неправильная, т. е. Степень полинома, стоящего в числителе, выше степени полинома, стоящего в знаменателе, то следует поделить эти полиномы друг на друга, выделить целую часть и затем интегрировать отдельно полученную целую часть и оставшуюся правильную рациональную дробь.

Пример. Вычислить

Решение. Делим полиномы друг на друга

1

Таким образом

и поэтому

Последний интеграл же вычислен выше.

Практическая часть к курсовой работе.

за Реализация метода простых коэффициентов в MapleФ.

Для определения конкретных значений сих коэффициентов следует привести равенство к общему знаменателю и сравнить коэффициенты при одинаковых степенях x в числителе. Т.е. по сути дела решить систему линейных равнений. Используется эта конструкция по большей части при вычислении интегралов, т.к. таким образом интеграл произвольной рациональной функции сводится, по сути дела, к сумме табличных интегралов. Этакая лекция по мат. анализу получилась.

Сразу скажу тем, кому вообще лень что-то делать по этому поводу. Maple делает все, что мы сейчас напишем, одной операцией:

> сonvert(rfun, parfrac, x);

И все. Спросите: зачем этот велосипед? Цель - не конечный результат, идея и методы ее реализации на Maple. Гораздо интереснее получается посмотреть на целую программу, реально работающий ниверсальный алгоритм, делающий конкретно нечто, чем просто читать обрывки help-ов под каждую команду языка на английском, не понимая в принципе, как это все связать воедино. Ясное дело, профессионалу, прочувствовавшему Maple, будет неинтересно читать подробные объяснения по поводу использованных функций языка, однако для изучающего систему не совсем новичка-математика это будет крайне полезно. Постараюсь в процессе показать читателю свое разумение философии пакета.

Как всегда первый вопрос: с чем работаем? Действительно, для отладки алгоритма необходимо создать хоть несколько рациональных дробей. Руками писать неудобно, поэтому даже этот этап сгрузим на машину.

> restart:

> readlib(randomize):

(а) > randomize():

(б) > d1:= rand(1..3):

> d2:= rand(2..7):

(в) > px:= randpoly(x, degree=21, coeffs=rand(-7..7), terms = 9):

(г) > for i from 1 to 3 do

> q[i]:= randpoly(x, degree=1, coeffs=rand(-7..7))^d1():

> q[i+3]:= (x^2 + x + d2())^d1():

> od:

(д) > rfun:= px/product(q[k], k=1..6);

Разберемся, что тут мы с вами наворотили. Итак, сначала подробно остановимся на генерации случайных целых чисел в системе Maple. (а) Ч здесь мы заставляем генератор случайных чисел привязаться к системному времени. Если этого не сделать, то генерируемая последовательность будет каждый раз одинаковой. Вызов просто функции rand() без аргументов возвратит двенадцатизначное случайное натуральное число. В большинстве случаев это ну совсем неудобно. Можно это дело исправить, передавая функции один аргумент: rand(n), что приведет к генерации числа из полуинтервала [0, n). Зачастую и этого недостаточно для решения поставленной задачи. Можно еще более сузить область значений - (б). Только в этом случае в d1 вернется отнюдь не число, а ссылка на процедуру, вызов которой приведет к генерации случайного числа из заданного отрезка. Произвольный полином максимальной степени 21 степени с коэффициентами из отрезка [-7,7] и девятью членами получим в (в). Дальше интереснее - нужно изготовить знаменатель. Сделаем его в виде произведения трех многочленов первой, и трех - второй степени. Причем по определению многочлены второй степени не должны иметь действительных корней. Реализующая эту задачу конструкция (г) очевидна и в пояснениях не нуждается. И наконец, собрав числитель и знаменатель в одно целое, в (д) получим нашу рациональную дробь. Выражение product(q[k], k=1..6); является формальным переводом на язык Maple записи:

Знаменатель полученной функции таким образом же будет разложен на множители. Для того чтобы задача приняла более правдоподобный характер, вместо (д) можно реализовать следующее:

> rfun:= px/expand(product(q[k], k=1..6), x);

Expand раскроет скобки и приведет подобные слагаемые относительно переменной x в знаменателе. В итоге получится настоящая рациональная дробь. То, что коэффициенты целые, Ч общности задачи не ограничивает - с таким же спехом мы могли сгенерировать их и иррациональными.

Если запустить все написанное, исключив строку (а) (генератор случайных чисел будет стандартно инициализирован), получится в точности:

Заметили? В знаменателе появилась не заказанная шестая степень. И вместо шести множителей получилось только пять. Ну и что? Просто два произвольных многочлена полностью совпали (и по степеням тоже). На что только ни способен генератор случайных чисел в Maple! Результат раскрытия можно посмотреть на рисунке - там он выглядит куда меньше.

Второй этап работы заключается в определении характера правильности дроби и выделении целой части (если нужно), т.е. представлению ее в виде:

где Z(x) - целая часть, R(x) не делится на Q(x). Сделаем это следующим образом:

> fracpart:= rem(numer(rfun), denom(rfun), x, 'zpart');

Заведем переменную fracpart и zpart соответственно для дробной и для целой части рациональной дроби. Процедура-функция rem возвращает остаток от деления многочленов как основной результат. Третий (необязательный) параметр - имя переменной, в которую будет вычислена целая часть. Совершенно аналогично действует функция quo, где основным результатом является целая часть от деления. Здесь функции numer и denom соответственно дают доступ к числителю и знаменателю дроби.

Сейчас начинается интересное, именно: попытка записать, собственно, само разложение с неопределенными коэффициентами. Для начала нужно пронализировать структуру знаменателя. Разложим его на множители:

> denomx:= factor(denom(rfun));

Разделим текущую подзадачу на два этапа: изготовление списка знаменателей будущих простейших дробей и запись самого разложения. Для реализации первого этапа нам понадобится написать процедуру-функцию, которая бы занималась преобразованием выражения вида A n в упорядоченный список вида [A, A 2, A 3,..., A n ].

(а) > transpol:= proc (p: polynom) local j;

(б) > if degree(p, x) <= 1 then

> p;

> else

(в) > if not type(op(2, p), numeric) then

> p;

> else

(г) > seq(op(1, p)^p, j=1.. op(2, p));

> fi;

> fi;

> end:

В (а) объявим имя функции, тип и количество передаваемых параметров, также локальные переменные в поле local. Результатом работы функции будет результат последней выполненной операции. Теперь опишем сам алгоритм. Если была передана константа либо многочлен первой степени, то вернется он же - (б). Дальше получим и пронализируем тип объекта op(2, p). Здесь я обращаюсь к многочлену p как к списку. Maple позволяет работать почти с любым из своих объектов как со списком. После проверки (б) у нас останется лишь три варианта для p : (x 2 +bx+c), (x 2 +bx+c) n, (ax+b) n. Их op(2, p) будет соответственно равен x 2, n, n. В первом случае (наш УopФ - не число) придется возвратить параметр в первозданном виде - это просто квадратный неприводимый трехчлен, в остальных Ч осуществляем разложение (г) - формируем нужную последовательность. Далее приготовим список знаменателей будущих простейших дробей, используя только что написанное:

> ds:= [seq(transpol(op(k, denomx)), k=1.. nops(denomx))];

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

ds:= [2, 2x+3, 5x-4, 4x-1, (4x-1) 2, (4x-1) 3, x 2 +x+2, x 2 +x+4, (x 2 +x+4) 2,...,(x 2 +x+4) 6 ]

Записать разложение с неопределенными коэффициентами, имея такую прелесть, ничего не стоит:

> rxn:= 0:

> lastvar:= 1:

> for i from 1 to nops(ds) do

(а) > if degree(op(1, op(i, ds)), x) = 1 then

(б) > rxn:= rxn + (A[lastvar])/op(i, ds);

> else

(в) > rxn:= rxn + (A[lastvar]*x+A[lastvar + 1])/op(i, ds);

> lastvar:= lastvar + 1;

> fi;

> lastvar:= lastvar + 1;

> od:

Теперь все сначала и по порядку. Заведем переменную rxn, в которую после запишем разложение. Счетчик lastvar же использованных индексов коэффициентов становим в значение 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 требует два параметра: первый - это набор равнений, второй - набор переменных. Результат работы будет представлен в виде опять же набора равенств. На этом этапе присвоения переменным, относительно которых решалась система, вычисленных значений не происходит. Чтобы это все-таки сделать, воспользуемся функцией assign в качестве параметра, которой передается набор равенств. Таким образом вычислены наши неопределенные A k -ые. Так как rxn через них выражается, то на результат можно посмотреть так (см. рисунок):

> zpart + rxn;

Это и есть разложение нашей rfun на сумму простейших дробей.

> simplify(zpart + rxn - rfun);

осуществит проверку тождественности (функция simplify как можно дальше простит выражение), возвратив 0. Другого и не должно быть, в противном случае алгоритм сработал некорректно, чего я от него никак не жду.

Приведенный пример лишний раз доказывает, что система Maple никак не является просто символьным калькулятором. В отличие от MathCad, где возможности программирования представлены не на высшем ровне, она позволяет реализовывать самые буйные фантазии по части построения сложнейших алгоритмов.

з Реализация метода простых коэффициентов на DelphiФ.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Spin, StdCtrls, Grids, MatUtilits;

type

signs = -1..1;

polinom = array of real;

fpolinoms = array of polinom;

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Edit1: TEdit;

StringGrid2: TStringGrid;

Edit2: TEdit;

SpinEdit1: TSpinEdit;

SpinEdit2: TSpinEdit;

Button1: TButton;

Memo1: TMemo;

Edit3: TEdit;

Label1: TLabel;

Label2: TLabel;

Edit4: TEdit;

procedure Button1Click(Sender: TObject);

procedure SpinEdit1Change(Sender: TObject);

procedure SpinEdit2Change(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

procedure Polinommul(a:polinom;n:byte;b:polinom;m:byte;var ab:polinom;var nm:byte);

procedure GetPolinom(r:fpolinoms;step:byte;flag:boolean;numdrob:byte;var res:polinom);

procedure Calculate(mass1:polinom;n:integer;var formula:string);

end;

const

n10 =10;

var

Form1: TForm1;

n1,n2,s1,s2:shortint;

roots1,roots2,znamen,matr:fpolinoms;

pol1,pol2,chislit:polinom;

matr1,koef:matdouble;

mass1:array of real;

elem:array[0..n10] of string[10];

equation,eq1,eq2,eq3:string;

implementation

{$R *.dfm}

Процедура перемножения объектов типа polinom, т. е. массивов с коэффициентами многочленов и получения результата их перемножения:

procedure TForm1.Polinommul(a:polinom;n:byte;b:polinom;m:byte;var ab:polinom;var nm:byte);

var

temp:real;

i,j,t:shortint;

p1:polinom;

begin

setlength(p1,m+n+1);

setlength(ab,m+n+1);

temp:=0;

for i:=0 to m+n doа p1[i]:=0;

for i:=0 to n do

for j:=0 to m do

begin

temp:=a[i]*b[j];

p1[i+j]:=p1[i+j]+temp;

end;

nm:=n+m;

ab:=p1;

{ t:=0;

for i:=0 to m+n do

if p1[i]=0 then

begin

t:=i+1;

continue;

end

else break;

setlength(ab,m+n-t);

for i:= 0 to m+n-t+1 do

ab[i]:=p1[i+t];

nm:=m+n-t+1;а }

end;

Процедура, которая из массива многочленов делает многочлен - или результат их перемножения - или произведение, но без i-го члена, в зависимости от flag.

procedure TForm1.GetPolinom(r:fpolinoms;step:byte;flag:boolean;numdrob:byte;var res:polinom);

var

buffer,buffer1,temp:polinom;

i,j,p,p1:byte;

flag1:boolean;

begin

if not(flag) then

begin

setlength(buffer,2);

setlength(buffer1,2);

setlength(temp,2);

buffer[0]:=r[0,0];

buffer[1]:=r[0,1];

p:=1;

p1:=1;

for i:=1 to step do

begin

setlength(temp,p1+1);

for j:=0 to 1 doа buffer1[j]:=r[i,j];

Form1.Polinommul(buffer,p,buffer1,1,temp,p1);

setlength(buffer,p1);

buffer:=temp;

p:=p1;

end;

end

else

begin

setlength(buffer,2);

setlength(buffer1,2);

setlength(temp,2);

buffer[0]:=0;

buffer[1]:=1.0;

p:=0;

p1:=0;

for i:=0 to step do

begin

if numdrob = i then

begin

buffer1[0]:=0;

buffer1[1]:=1.0;

end;

if numdrob<>i then inc(p);

if numdrob<>i then for j:=0 to 1 doа buffer1[j]:=r[i,j];

if numdrob=i then

begin

Form1.Polinommul(buffer,p,buffer1,1,temp,p1);

continue;

end;

Form1.Polinommul(buffer,p,buffer1,1,temp,p1);

if numdrob<>i then setlength(buffer,p1);

buffer:=temp;

end;

end;

setlength(res,p1);

res:=buffer;

end;

Основной текст программы, вбирающий в себя процедуры и реализовающий сам процесс разложения на простые множители. Его я повесил на кнопку: а

procedure TForm1.Button1Click(Sender: TObject);

var

i,j,k:byte;

temp:polinom;

st1,st2,st3,stt:string;

begin

Form1.Edit1.Text:='';

Form1.Edit2.Text:='';

Form1.Edit3.Text:='';

Form1.Edit4.Text:='';

n1:=strtoint(Form1.SpinEdit1.Text);

n2:=strtoint(Form1.SpinEdit2.Text)-1;

setlength(chislit,n1+1);

setlength(roots2,n2+1,2);

setlength(znamen,n2,n2);

for i:=0 to n1 do

begin

chislit[i]:=strtofloat(Form1.StringGrid1.Cells[i,0]);

end;

for i:=0 to n2 do

begin

roots2[i,0]:=1.0;

roots2[i,1]:=-strtofloat(Form1.StringGrid2.Cells[i,0]);

end;

form1.GetPolinom(roots2,n2,false,0,pol2);

setlength(temp,n2+1);

for i:=0 to n2 do

begin

for k:=0 to n2 do temp[k]:=0;

form1.GetPolinom(roots2,n2,true,i,temp);

for j:=0 to n2 do

Form1.Edit3.Text:= Form1.Edit3.Text+getfstring(temp[j+1],1)+' ';

for k:=0 to n2 do temp[k]:=0;

end;

form1.Calculate(chislit,n1+1,st1);

form1.Calculate(pol2,n2+2,st2);

Form1.Edit1.Text:=st1;

Form1.Edit2.Text:=st2;

{for i:=0 to n1 do

Form1.Edit1.Text:=Form1.Edit1.Text+getfstring(chislit[i],1)+' ';

for i:=0 to n2+1 do

Form1.Edit2.Text:=Form1.Edit2.Text+getfstring(pol2[i],1)+' ';}

Setlength(matr,n2+2,n2+1);

for i:=0 to n2 do

begin

form1.GetPolinom(roots2,n2,true,i,temp);

for j:=1 to n2+1 do matr[i,j-1]:=temp[j];

end;

i:=0;

for j:=0 to n2 do

matr[n2+1,j]:=0;

for j:=n2-n1 to n2 do

begin

matr[n2+1,j]:=chislit[i];

inc(i);

end;

setlength(matr1,n2+1,n2+2);

setlength(koef,n2+1,1);

for i:=0 to n2 do

for j:=0 to n2+1 do

matr1[i,j]:=matr[j,i];

korni(matr1,n2+1,n2+2,koef);

for i:=0 to n2 do

form1.Edit4.Text:=form1.Edit4.Text+getfstring(koef[i,0],3)+' ';

end;

procedure TForm1.SpinEdit1Change(Sender: TObject);

begin

Form1.StringGrid1.ColCount:=strtoint(Form1.SpinEdit1.Text)+1;

end;

procedure TForm1.SpinEdit2Change(Sender: TObject);

begin

Form1.StringGrid2.ColCount:=strtoint(Form1.SpinEdit2.Text);

end;

procedure TForm1.FormCreate(Sender: TObject);

var i:shortint;

begin

Form1.StringGrid1.ColCount:=strtoint(Form1.SpinEdit1.Text)+1;

Form1.StringGrid2.ColCount:=strtoint(Form1.SpinEdit2.Text);

end;

Чтобы вид был более нагляден и информативен, я использовал процедуру преобразования массива коэффициентов:

procedure TForm1.Calculate(mass1:polinom;n:integer;var formula:string);

var

i,j,k1:byte;

sign:array of signs ;

first,flag:boolean;

odin:array of boolean;

s:integer;

begin

k1:=n-1;

for i:=0 to n-1 do

begin

elem[i]:='x^'+inttostr(k1);

dec(k1);

end;

first:=true;

setlength(odin,n);

setlength(sign,n);

setlength(mass1,n);

equation:='';

for i:=0 to n-1 do //calculating and building

begin

if abs(mass1[i])=1 then odin[i]:=true; //esli ediniza

if mass1[i]>0 then sign[i]:=1 //check sign

else

if mass1[i]=0 then sign[i]:=0

else sign[i]:=-1;

if odin[i] thenа //esli ediniza

begin

if i<n-1 then

case sign[i] of

1:

if first then

begin

equation:=equation+elem[i];

first:=false;

end

else

equation:=equation+' + '+elem[i];

0:

continue;

-1:

begin

if first then first:=false;

equation:=equation+' - '+elem[i];

end;

end

else

case sign[i] of

1:

if first then

begin

equation:=equation+'1';

first:=false;

end

else

equation:=equation+' + 1';

0:

continue;

-1:

begin

if first then first:=false;

equation:=equation+' - 1';

end;

end;

continue;

end;

if i = n-1 then

case sign[i] of

1:

if first then

begin

equation:=equation+getfstring(abs(mass1[i]),3);

first:=false;

end

else

equation:=equation+' + '+getfstring(abs(mass1[i]),3);

0:а continue;

-1:

begin

if first then first:=false;

equation:=equation+' - '+getfstring(abs(mass1[i]),3);

end;

end

else

case sign[i] of

1:

if first then

begin

equation:=equation+getfstring(abs(mass1[i]),3)+'*'+elem[i];

first:=false;

end

else

equation:=equation+' + '+getfstring(abs(mass1[i]),3)+'*'+elem[i];

0:

continue;

-1:

begin

equation:=equation+' - '+getfstring(abs(mass1[i]),3)+'*'+elem[i];

if first then first:=false;

end;

end;

end;

s:=0;

{ for i:=0 to n-1 do

s:=s+abs(mass1[i]);

if s=0 then equation:='0';а }

formula:=equation;

end;

end.

Пример:

Заключение.

В моей курсовой работе я рассмотрел подробно метод простых коэффициентов и реализовал программу на Delphi, которая вычисляет значения коэффициентов для случая простых действительных корней знаменателя. В Maple эта процедура тоже есть и вычисляет коэффициенты для любой дробно - рациональной функции. Нехватка времени не позволила мне довести мою программу до полной функциональности: вычисление коэффициентов для любого знаменателя, т. е. знаменателя с любыми корнями. В дальнейшем, может быть, я это осуществлю. Однако, даже в таком варианте она полезна для практического использования - быстрого вычисления коэффициентов.

Список литературы.

1.Бахвалов Н.С., Лапин А.В., Кобельков Г. М. Численные методы. - М.: Физматлит, 2001.

2.Волков Е.А. Численные методы. - Петербург, изд - во Лань, 2004.

3.Демидович Б.П., Марон И.А. Основы вычислительной математики. - М.: Наука, 1970.

4.Вержбицкий В.М. Численные методы. Линейная алгебра и нелинейные равнения. - М.: Высшая школа, 2.

5.Бахвалов Н.С., Лапин А.В. Численные методы в задачах и пражнениях. - М.: Высшая школа, 2.

6.Фаддеев Д.К., Фаддеева В.Н. Вычислительные методы линейной алгебры. - Петербург, изд Цво Лань, 2002.

7.Самарский А.А., Гулин А.В. Численные методы математической физики. - М.: Научный мир, 2003.

8.Деммель Дж. Вычислительная линейная алгебра. - М.: Мир, 2001.

9.Косарев В.И. 12 лекций по вычислительной математике. - М.: изд Цво МФТИ, 2.

10. Лобанов А.И., Мещеряков М.В., Чудов Л.А. Задачи для самостоятельного исследования в курсе вычислительной математики. - М.: изд Цво МФТИ, 2001