Найти тему

Polynomial_p3.zip

Оглавление

Частично

О программировании

Расположен там. Содержит половину предполагавшейся работы.

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

1. Написаны аналоги С-функций работы с динамической памятью, учитывающие составной характер коэффициентов. Скажем, например, при освобождении блока динамической памяти сначала надо подвергнуть деструктору расположенные там объекты.

2. С использованием этих составных аналогов функций работы с динамической памятью, написан шаблон Polynomial_B<>, создающий классы многочленов с составными коэффициентами. (B = bulky.) Меня преследует подозрение, что примененные мною приемы, будучи в какой-то мере обобщены, и приведут к тому, что лежит в основе Standard Template Library (STL).

3. Одна из реализаций шаблона позволила получить класс многочленов с двумя переменными с коэффициентами double. Дело в том, что, например, многочлен t²s + ts² + t² – ts + 0.5 s – 1 может быть представлен в виде
(s + 1)t² + (s² – s)t + (0.5 s – 1), то есть в виде многочлена от переменной t, коэффициентами которого являются многочлены от переменной s. так что класс многочленов с коэффициентами типа
Poly_double представляет интерес. Я реализовал далеко не все содержательные операции над многочленами двух переменных, но только те, которые были мне необходимы для решения прикладных задач. Если читателю нужны еще какие-то операции, то, следуя по наезженной колее, это нетрудно сделать. А можно обратиться ко мне.

4. Прикладные задачи состояли в реализации численного метода вычисления (извините, если потревожу ваши нежные ушки) спектрального радиуса самосопряженного интегрального оператора. Сделан рассчет одной контрольной задачи с известным ответом и одной, которая возникла у меня много лет назад в научной работе.

5. Слабое место этих рассчетов — наличие ошибок округления в арифметике double, которые еще имеют скверную привычку накапливаться. Такая математическая система, как Maple, предоставляет возможность считать без ошибок округления, но замеры показали, что она работает в десятки раз медленнее, чем C++ с разработанными классами.

6. Поэтому следующий шаг — создание класса многочленов с рациональными коэффициентами. Каждый такой коэффициент содержит два поля — числитель и знаменатель — которые хранятся в динамической памяти в виде целых значений неограниченного размера. Это будет работать без округлений. Но, конечно, намного медленнее, чем в случае коэффициентов double, но благодаря узкой специализации класса есть надежда, что все-таки быстрее, чем Maple.

Вот перед этим этапом работы я пока остановился. Продолжение следует.