Тверской государственный университет
Опубликован: 02.12.2009 | Доступ: свободный | Студентов: 3450 / 677 | Оценка: 4.41 / 4.23 | Длительность: 09:18:00
ISBN: 978-5-9963-0259-8
Лекция 6:

Массивы

Сложение и умножение полиномов

При рассмотрении полинома Лагранжа возникала необходимость в нахождении суммы полиномов одинаковой степени, заданных своими коэффициентами. Пусть P(x) и Q(x) - полиномы степени n и m, соответственно, заданные своими коэффициентами, и пусть для определенности n >= m. Тогда суммой полиномов называется полином R(x) степени n, коэффициенты которого вычисляются следующим образом:

R(x)=P(x)+Q(x)\Rightarrow \sum\limits_{i=0}^n c_i x^i=\sum\limits_{i=0}^n a_i x^i+\sum\limits_{i=0}^m b_i x^i\Rightarrow\\ c_i=a_i+b_i\quad \forall i<=m;\\ c_i=a_i\quad \forall i:m<i<=n;

Пусть полиномы P(x) и Q(x) заданы, подобно полиному Лагранжа, точками, через которые они проходят:

P(x):\{(px_0,py_0),(px_1,py1),\ldots(px_n,py_n)\}\\ Q(x):\{(qx_0,qy_0),(qx_1,qy1),\ldots(qx_m,qy_m)\}

Тогда нетрудно найти подобное представление и для полинома R(x), представляющего сумму полиномов:

R(x):\{(rx_0,ry_0),(rx_1,ry1),\ldots(rx_n,ry_n)\},\quad\text{где}\\ rx_i=px_i;\quad ry_i=py_i+Q(px_i);

В этом случае понадобится вычислить значения полинома Q(x) в n точках.

Если полиномы P(x) и Q(x) заданы своими корнями, то определить корни полинома суммы не удается, более того, у суммы вообще может не быть корней. В этом случае для каждого полинома по корням можно вычислить коэффициенты, а затем определить коэффициенты полинома суммы. Можно также рассматривать корни как частный случай задания множества точек, через которые проходит полином, и применить предыдущую схему для определения множества точек, через которые проходит полином суммы.

Рассмотрим теперь операцию умножения полиномов:

S(x)=P(x)*Q(x)

Нетрудно понять, что полином S(x) является полиномом степени n+m и имеет n+m+1 коэффициент. Как вычисляется произведение, если заданы полиномы сомножители P(x) и Q(x)? Замечу, что произведение полиномов часто встречается на практике и имеет специальное имя - свертка полиномов.

В отличие от сложения полиномов проще всего найти свертку, если заданы корни обоих полиномов. В этом случае никаких вычислений не требуется, поскольку n корней P(x) и m корней Q(x) будут n+m корнями S(x). Если у полиномов P(x) и Q(x) есть совпадающие корни, то у S(x) появятся кратные корни.

Если исходные полиномы P(x) и Q(x) заданы своими точками, то нетрудно получить набор точек для полинома произведения. Схема во многом похожа на ту, что имеет место при сложении полиномов, заданных точками:

S(x)=\{(sx_0,sy_0),(sx_1,sy_1),\ldots(sx_{n+m},sy_{n+m})\},\quad\text{где}\\ sx_i=px_i;\quad sy_i=py_i*Q(px_i)\quad \forall i:i<=n;\\ sx_i=qx_{i-n-1};\quad sy_i=qy_{i-n-1}*P(qx_{i-n-1})\quad \forall i:n<i<=n+m+1

Для получения множества точек, задающих представление полинома S(x), приходится вычислять значение полинома Q(x) в n точках и значение полинома P(x) в m точках, а затем выполнять соответствующее умножение значений двух полиномов.

Если исходные полиномы P(x) и Q(x) заданы своими коэффициентами, то имеем:

S(x)=P(x)*Q(x)=(\sum\limits_{i=0}^n a_i x^i)*(\sum\limits_{j=0}^m b_j x^j)

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

S(x)=\sum\limits_{i=0}^{n+m}d_i;\quad\text{где}\\ d_i=\sum\limits_{k+r=i}a_k b_r;\quad k\in[0,n];\quad r\in[0,m]

Суммирование идет по всем наборам k и r, дающим в сумме значение i. Понятно, что для крайних значений (i=0 и i=n+m) сумма состоит из одного члена, поскольку подобные члены для x в нулевой степени и степени n+m отсутствуют. Число членов суммирования увеличивается при приближении к середине интервала [0, n+m].

Итоги

Подводя некоторые итоги, отметим, что полином можно задать тремя разными способами - его коэффициентами, корнями и точками, через которые проходит полином. Если заданы коэффициенты полинома, то за время, пропорциональное n^2, (T(n) = O(n^2)) можно вычислить значения полинома в n+1 точках. Для вычисления значения полинома в одной точке применяется схема Горнера, выполняющая вычисления за линейное (пропорциональное n) время. Существует и обратное преобразование. Если заданы n+1 точки, через которые проходит полином, то алгоритм Лагранжа позволяет за время O(n^2) вычислить коэффициенты полинома. Задача получения коэффициентов полинома по точкам называется задачей интерполяции, а полином Лагранжа называется интерполяционным полиномом.

Если заданы корни, то можно получить два других представления. Рассмотренный нами алгоритм позволяет по корням полинома за время O(n^2) вычислить коэффициенты полинома. Алгоритм использует итеративную схему из n шагов, где на каждом шаге выполняется операция повышения степени, выполняемая за линейное время. Поскольку корни являются частным случаем задания множества точек, через которые проходит полином, то задание корней автоматически задает и представление полинома набором точек. Обратная задача - получение корней по коэффициентам или заданным точкам - так просто не решается. Точное ее решение существует для полиномов второй и третьей степени, но не в общем случае. Для нахождения корней приходится использовать приближенные итеративные методы, например, метод простой итерации или Ньютона.

Задание полинома его корнями является наиболее информативным. Если известны корни, то без труда выполняется свертка полиномов. Вычисление значения полинома в заданной точке выполняется за n умножений, не требуя применения схемы Горнера. Несколько сложнее выполняется операция сложения полиномов. К сожалению, на практике редко встречается ситуация, когда известны корни полинома, но такое бывает - алгоритм Лагранжа тому пример.

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

На практике полиномы чаще всего появляются при задании множества точек. Ситуация обычно такова. В результате экспериментов измеряются значения некоторой функции в ряде точек. Требуется предсказать, каково будет значение этой функции в других точках, в которых измерения не проводились. Если из теоретических соображений не известен вид функции, то чаще всего ее задают в виде полинома, проходящего через точки, полученные экспериментальным путем. В этой постановке задачу построения полинома и вычисления значений полинома в точках, не подлежащих измерениям, называют задачей интерполяции, а полином Лагранжа называют интерполяционным полиномом. Задача интерполяции корректно решается, когда новые точки, в которых проводятся вычисления, лежат внутри интервала, заданного измеренными точками. Полиномы плохо приспособлены для решения задачи экстраполяции, когда точки лежат вне интервала измерений, из-за быстрого роста значения полинома вне этого интервала. Чем выше степень полинома, тем быстрее его рост.

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

Одно замечание к задаче свертки полиномов. Приведенный алгоритм решения этой задачи для полиномов, заданных своими коэффициентами, требует квадратичного времени. Ввиду практической важности этой задачи много внимания уделялось поиску наиболее эффективного по временной сложности алгоритма. Существуют алгоритмы, решающие эту задачу за время O(n*log(n)). Эти алгоритмы используют технику быстрого преобразования Фурье и обратного к нему. Они сложнее в реализации и требуют работы с комплексными числами или выполнения операций модульной арифметики. Здесь они только упоминаются и детально не рассматриваются.

Задачи

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

  • 28. Полином P(x) задан своими коэффициентами. Дан массив координат X. Вычислить, используя схему Горнера, массив значений полинома в точках x_i.
  • 29. Полином P(x) задан своими корнями и старшим коэффициентом an. Дан массив координат X. Вычислить массив значений полинома в точках x_i.
  • 30. (задача интерполяции) Полином P(x) задан координатами n+1 точек, через которые он проходит. Дан массив координат X. Вычислить массив значений полинома в точках x_i.
  • 31. Полином P(x) задан своими корнями и старшим коэффициентом an. Вычислить коэффициенты полинома.
  • 32. (задача построения интерполяционного полинома Лагранжа) Полином P(x) задан координатами n+1 точек, через которые он проходит. Вычислить коэффициенты полинома.
  • 33. Полином P(x) задан своими коэффициентами. Дан массив чисел X. Построить полином Q(X), имеющий своими корнями числа из массива X и корни полинома P(x).
  • 34. Полином P(x) задан своими коэффициентами. Для полинома известны два его корня - x0 и xn. Построить полином Q(x), корни которого совпадают с корнями полинома P(x), за исключением корней x0 и xn.
  • 35. Полиномы P(x) и Q(x) заданы своими корнями и старшими коэффициентами. Вычислить коэффициенты суммы полиномов P(x) и Q(x).
  • 36. Полиномы P(x) и Q(x) заданы своими корнями и старшими коэффициентами. Вычислить коэффициенты произведения полиномов P(x) и Q(x).
  • 37. Полиномы P(x) и Q(x) заданы своими коэффициентами. Вычислить коэффициенты суммы полиномов P(x) и Q(x).
  • 38. Полиномы P(x) и Q(x) заданы своими коэффициентами. Вычислить коэффициенты произведения полиномов P(x) и Q(x).
  • 39. Полиномы P(x) и Q(x) заданы точками, через которые они проходят. Вычислить коэффициенты суммы полиномов P(x) и Q(x).
  • 40. Полиномы P(x) и Q(x) заданы точками, через которые они проходят. Вычислить коэффициенты произведения полиномов P(x) и Q(x).
  • 41. Полином P(x) задан своими коэффициентами. Определить интервал, если он существует, на котором полином имеет хотя бы один корень.
  • 42. Полином P(x) задан точками, через которые он проходит. Определить интервал, если он существует, на котором полином имеет хотя бы один корень.
  • 43. Для полинома P(x), заданного своими коэффициентами, известен интервал, на котором полином имеет хотя бы один корень. Найти корень с заданной точностью, используя схему дихотомии.
  • 44. Построить интерфейс пользователя, позволяющий ему находить корни полинома. В основу поиска положить схему исследования интервала и дихотомии.
  • 45. Построить интерфейс пользователя, позволяющий ему находить корни полинома. В основу поиска положить метод простой итерации.
  • 46. Построить интерфейс пользователя, позволяющий ему находить корни полинома. В основу поиска положить метод Ньютона.
Проект
  • 47. Построить проект, включающий построение интерфейса пользователя и класса Polinom. Методы класса должны реализовать все алгоритмы, рассмотренные в этом разделе. Интерфейс пользователя должен позволять пользователю решать основные задачи, возникающие при работе с полиномами.
Алгоритмы линейной алгебры

Матрицей называется набор чисел, состоящий из m строк и n столбцов. Для программиста матрица - это двумерный массив. Матрица называется квадратной, если m = n, и прямоугольной - в противном случае. Числа m и n определяют размерность матрицы. Над прямоугольными матрицами определены операции транспонирования, сложения, умножения.

Пусть A - матрица размерности m*n (из m строк и n столбцов) с элементами a_{i,j}. Транспонированной матрицей B = AT называют матрицу размерности n*m, элементы которой b_{i,j} = a_{j,i}. В транспонированной матрице строки исходной матрицы становятся столбцами.

A=\left|\left|\begin{array}{l}a_{1,1},a_{1,2}\ldots a_{1,n}\\ a_{2,1},a_{2,2}\ldots a_{2,n}\\ \ldots\\ a_{m,1},a_{m,2}\ldots a_{m,n}\end{array}\right|\right| \quad B=A^T=\left|\left|\begin{array}{l}a_{1,1},a_{2,1}\ldots a_{m,1}\\ a_{1,2},a_{2,2}\ldots a_{m,2}\\ \ldots\\ a_{1,n},a_{2,n}\ldots a_{m,n}\end{array}\right|\right|

Операция сложения определена над прямоугольными матрицами одинаковой размерности. Пусть A, B, C - прямоугольные матрицы размерности m*n. Тогда сумма матриц определяется естественным образом:

A=\left|\left|\begin{array}{l}a_{1,1},a_{1,2}\ldots a_{1,n}\\ a_{2,1},a_{2,2}\ldots a_{2,n}\\ \ldots\\ a_{m,1},a_{m,2}\ldots a_{m,n}\end{array}\right|\right| \quad B=\left|\left|\begin{array}{l}b_{1,1},b_{1,2}\ldots b_{1,n}\\ b_{2,1},b_{2,2}\ldots b_{2,n}\\ \ldots\\ b_{m,1},b_{m,2}\ldots b_{m,n}\end{array}\right|\right|\\ C=A+B=\left|\left|\begin{array}{l}a_{1,1}+b_{1,1},a_{1,2}+b_{1,2}\ldots a_{1,n}+b_{1,n}\\ a_{2,1}+b_{2,1},a_{2,2}+b_{2,2}\ldots a_{2,n}+b_{2,n}\\ \ldots\\ a_{m,1}+b_{m,1},a_{m,2}+b_{m,2}\ldots a_{m,n}+b_{m,n}\end{array}\right|\right|

Операция умножения определена над прямоугольными матрицами, у которых число столбцов первого сомножителя равно числу строк второго сомножителя. Матрица произведения имеет число строк, равное числу строк первого сомножителя, и число столбцов, равное числу столбцов второго сомножителя. Пусть A - матрица размерности m*p, B - размерности p*n, тогда матрица C= A*B имеет размерность m*n. Элементы матрицы произведения определяются как сумма попарных произведений элементов строки первого сомножителя на элементы столбца второго сомножителя.

A=\left|\left|a_{i,j}\right|\right|\quad i=1,...m;\;j=1,...p;\quad B=\left|\left|b_{j,k}\right|\right|\quad j=1,...p;\;k=1,...n\\ C=A*B=\left|\left|c_{i,k}\right|\right|\quad i=1,...m;\;k=1,...n;\\ c_{i,k}=\sum\limits_{j=1}^p a_{i,j}*b_{j,k}; ( 6.7)

Умножение всегда определено для прямой и транспонированной матрицы. Если A - прямоугольная матрица размерности m*n, то всегда определена квадратная матрица B размерности m*m:

B = A*A^T = B^T = (A*A^T)^T = (A^T)^T*A^T= A*A^T

Результатом такого произведения является симметричная матрица. Квадратная матрица называется симметричной, если a_{i,j} = a_{j,i} для всех i и j, или, что то же, если A = A^T. Операции транспонирования, сложения и умножения обладают следующими свойствами:

(A^T)^T=A;\quad (A+B)^T=A^T+B^T;\quad (A*B)^T=B^T*A^T
Квадратные матрицы

Квадратная матрица называется диагональной, если все элементы, кроме диагональных, равны нулю, то есть a_{i,j} = 0 при i /=j.

Квадратная матрица называется единичной, если все элементы, кроме диагональных, равны нулю, а диагональные элементы равны единице, то есть a_{i,j} = 0 при i /=j и a_{i,j} = 1 при i = j. Единичная матрица обозначается обычно буквой E, и она играет роль единицы при умножении матриц, поскольку для любой квадратной матрицы A и единичной матрицы E той же размерности имеют место соотношения:

A*E = E*A = A

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

D(A)=\left|\begin{array}{l}a_{1,1},a_{1,2}\ldots a_{1,n}\\ a_{2,1},a_{2,2}\ldots a_{2,n}\\ \ldots\\ a_{n,1},a_{n,2}\ldots a_{n,n}\end{array}\right|

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

  • Определитель диагональной матрицы равен произведению диагональных элементов. Отсюда следует, что определитель матрицы E равен 1.
  • Определитель матрицы не меняется при выполнении над матрицей элементарных преобразований. Под элементарной операцией (преобразованием) понимается прибавление к любой строке матрицы линейной комбинации других ее строк. В частности, если к строке матрицы с номером j прибавить строку с номером k (k /= j), умноженную на некоторое число, то определитель матрицы не изменится.
  • Если все элементы одной строки матрицы умножить на некоторое число q, то определитель матрицы изменится в q раз (умножается на q).
  • Если переставить местами строки j и k, то модуль определителя не изменится, но изменится знак, если разность |k-j| является нечетным числом.
  • Определитель произведения матриц равен произведению определителей:
    D(A*B) = D(A)*D(B)

Не приводя общего формального определения, рассмотрим ниже алгоритм вычисления определителя матрицы, основанный на его свойствах.

Если определитель квадратной матрицы A не равен нулю, то существует обратная матрица, обозначаемая как A^{-1}. Прямая и обратная матрицы связаны соотношением:

A*A^{-1} = A^{-1}*A = E

Операции транспонирования, умножения и обращения матриц связаны соотношениями:

(A^T)^{-1} = (A^{-1})^T;\quad (A*B)^{-1} = B^{-1}*A^{-1}

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

Иногда полезно рассматривать матрицу, состоящую не из элементов, а из клеток, каждая из которых является матрицей. Все определения операций над матрицами, элементы которых являются числами, переносятся на матрицы, элементы которых являются клетками. Такое представление особенно полезно для разреженных матриц, где большинство элементов являются нулями. Тогда можно представить такую матрицу как клеточную матрицу, многие клетки которой равны нулю. Используя знание структуры подобных матриц, можно в результате существенно сократить объем вычислений. Рассмотрим простой пример умножения двух матриц размерности 100*100, каждая из которых задана в виде четырех клеток:

A=\left|\left|\begin{array}{lr}A(20*40)&B(20*60)\\ C(80*40)&D(80*60)\end{array}\right|\right|\quad M1=\left|\left|\begin{array}{lr}E(40*70)&F(40*30)\\ G(60*70)&H(60*30)\end{array}\right|\right|\\ M2=M*M1=\left|\left|\begin{array}{lr}A*E+B*G&A*F+B*H\\ C*E+D*G&C*F+D*H\end{array}\right|\right|

В круглых скобках для клеток заданы их размерности. Пусть теперь некоторые клетки нулевые, например, таковыми являются клетки D, F и G. Тогда матрица M2 имеет вид:

M2=\left|\left|\begin{array}{cc}A*E&B*H\\ C*E&0\end{array}\right|\right|

Для вычисления матрицы M2 необходимо будет найти произведение трех пар матриц, но значительно меньших размеров, чем исходные матрицы. В целом объем вычислений сократится более чем в три раза.

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

Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?