Объектный подход в преподавании вычислительной математики

Галимянов Анис Фуатович

доцент, к.ф.-м.н., доцент кафедры информационных систем,

Казанский (Приволжский) федеральный университет,

ул. Кремлевская, 31, г. Казань, 420015, (8905)0210915

anis_59@mail.ru

Галимянов Фанис Анисович

ассистент кафедры информатики и прикладной математики,

Казанский национальный исследовательский технологический университет,

ул. К.Маркса, 68, г. Казань, 420015, (843)2314119

fanisga@mail.ru

Аннотация

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

Problems of teaching of calculus mathematics with application of object-oriented programming on an example are formulated. The example of the program illustrating application the principles of object-oriented programming for the solution of a specific objective of calculus mathematics is given.

Ключевые слова

объектно-ориентированное программирование, проблемы обучения, вычислительная математика

object-oriented programming, training problems, calculus mathematics

Введение

Объектно-ориентированный подход является одним из популярных подходов в современном программировании. Де факто он является стандартом во многих фирмах. Практически все системы программирования поддерживают объектно-ориентированное программирование. Объектно-ориентированный стиль повысил надежность программного продукта, производительность отдельного программиста и коллектива программистов. Объектно-ориентированное программирование как отдельный предмет или как часть предмета по программированию входит практически во все учебные программы, где обучают программированию. Объектно-ориентированный подход в дидактике программной инженерии с диагностикой эффективности подготовки и переподготовки кадров рассматривается в работах [1-3].

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

Особенности использования объектно-ориентированного программирования при выполнении лабораторных работ по вычислительной математике

В основном, кроме выполнения курсовых проектов и работ, программирование в учебной деятельности остается «вещью в себе», то есть при выполнении заданий по предметам программирования, выполняются чисто модельные задачи. Поэтому, решение лабораторных заданий по вычислительной математике, является, чуть ли не единственным приложением программирования, где задачи другого предмета надо решать средствами и технологиями программирования. Здесь применение объектно-ориентированного подхода может быть полезным вдвойне. Во-первых, на конкретных задачах студент применяет определенный, в данном случае, объектно-ориентированный подход, во-вторых на математические объекты студент может смотреть другим взглядом, а именно, с точки зрения объектно-ориентированного стиля. Здесь те же трудности, которые были перечислены в работе [4] проявляются и к ним добавляются дополнительные трудности. Вкратце перечислим их как в [4], указывая дополнительные нюансы для задач вычислительной математики:

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

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

В-третьих, большинство преподавателей высшей школы являются представителями старшего поколения (по некоторым оценкам средний возраст преподавателей бюджетного ВУЗа в России начала XXI века составляет 60-65 лет).  Они имеют огромный опыт структурного программирования и здесь «приходится обучаться вместе», переделывая (и не всегда удачно) существующие программы по стилю ООП.

В-четвертых, наука программирования быстро развивается, поэтому полученные обычно на начальных курсах знания приемов программирования к моменту окончания ВУЗа в значительной мере устаревают. Но, вычислительная математика, как часть математики, более консервативна. Но, как указано в [4], учебный процесс должен прививать специалисту качества оперативной реакции на новые идеи и технологии программирования, в том числе и применительно к вычислительной математике.

Что касается пятого пункта, отмеченного в [4], к вычислительной математике он имеет отношение, и молодой специалист должен уметь «повышать» уровни сложности, то есть на основе простых уметь решать более сложные задачи.

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

Как указано в седьмом пункте [4], связь дисциплин, изучаемых студентом, является весьма важной. Здесь особо нужно и можно показать целостность учебного материала по математике, вычислительной математике и программированию.

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

Объектно-ориентированному подходу для решения задач вычислительной математики посвящены много работ (см. напр. [6-8]). Здесь мы рассмотрим решение простой, но вместе с тем очень удобной для демонстрации возможностей и особенностей объектно-ориентированного программирования задачи – приближенного вычисления интегралов с помощью квадратурных формул.

Как известно (см. напр. [5]), квадратурной формулой для вычисления интеграла называется формула

,

где - коэффициенты, -узлы,  - остаточный член квадратурной формулы,  - подынтегральная функция. Квадратурная формула называется сходящейся, если . Существуют самые разные способы построения квадратурных формул. Обычно лабораторные работы посвящаются построению самых простых из них – квадратурных формул Ньютона-Котеса, а именно, квадратурных формул левых, правых и средних прямоугольников, формул трапеции и Симпсона. Формулы Ньютона-Котеса являются интерполяционными квадратурными формулами, то есть их можно получить посредством интегрирования интерполяционного многочлена по соответствующим узлам. Но если смотреть по определению, то для сходимости квадратурной формулы Ньютона-Котеса количество узлов квадратурной формулы (а, значит и интегрируемого интерполяционного многочлена) надо устремить к бесконечности, а это технически сложно осуществляемая задача. Квадратурные формулы же левых, средних, правых прямоугольников – это формулы с одним узлом, трапеций – с двумя, Симпсона – с тремя узлами. Поэтому их называют малыми формулами. Для построения больших квадратурных формул используют свойство аддитивности интеграла по области интегрирования

,

а затем к каждому частичному интегралу применить ту или иную квадратурную формулу:

  1. левых прямоугольников
  2. средних прямоугольников
  3. правых прямоугольников
  4. трапеций .

Для примера мы здесь рассмотрим только эти квадратурные формулы.

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

Использование объектно-ориентированного подхода при построении квадратурных формул

Как прослеживается из структуры большой квадратурной формулы, при её построении используются малые квадратурные формулы, каждый из которых имеет «свою» формулу. Способ построения большой формулы – общий. Поэтому здесь можно применить полиморфизм. Слово «полиморфизм» означает по-гречески «много форм», то есть объекты-адресаты, в нашем случае квадратурные формулы, могут оказаться относящимися более чем одному типу (в данном случае, к одному из четырех типов). Существует три типа полиморфизма [7]: полиморфизм включения, позволяющий решать во время работы программы, какой метод будет применен (динамическое связывание); операционный полиморфизм, применяющийся к методу с несколькими определениями (перегрузка функции) и параметрический полиморфизм, использующий типы в качестве параметра в описании класса. Так как, в качестве языка реализации используется DELPHI, второй и третий виды в данном случае не подходят, используется первый. Данный вид полиморфизма основан на динамическом связывании и является более гибким, хотя и несколько понижает скорость работы программы.

Приведем полный текст программы (консольное приложение).

program KvadFormula;

 

{$APPTYPE CONSOLE}

 

uses

  SysUtils;

Type TFunct=function(x:double):double;

   Type

       TKvadrFormula=class

          Method:string;

          f:TFunct;

          h:double;

          constructor Create(f_:TFunct;MethodI:string);

          function formula(lk,pk:double):double;virtual;abstract;

          function IntegrSum(a,b:double;N:integer):double;virtual;

          end;

       Type

          TLpr=class(TKvadrFormula)

          function formula(lk,pk:double):double;override;

       end;

       Type

          TRpr=class(TKvadrFormula)

          function formula(lk,pk:double):double;override;

       end;

       Type

          TSpr=class(TKvadrFormula)

          function formula(lk,pk:double):double;override;

       end;

       Type

          TTrapecia=class(TKvadrFormula)

          function formula(lk,pk:double):double;override;

       end;

       constructor TKvadrFormula.Create(f_:TFunct;MethodI:string);

       begin

           f:=f_;

           Method:=MethodI;

       end;

       function TLpr.formula;

       begin

           result:=f(lk)*h;

       end;

       function TRpr.formula;

       begin

           result:=f(pk)*h;

       end;

       function TSpr.formula;

       begin

           result:=f((lk+pk)/2)*h;

       end;

       function TTrapecia.formula;

       begin

           result:=(f(lk)+f(pk))*h/2;

       end;

       function TKvadrFormula.IntegrSum(a,b:double;N:integer):double;

       var s:double; i:integer;

       begin

           h:=(b-a)/N;

           s:=0;

           for i:=0 to N-1 do

           s:=s+formula(a+i*h,a+(i+1)*h);

           result:=s;

       end;

       function f(x:double):double;

       begin

         result:=sin(x);

       end;

       var SIntegr,SIntegr1:TKvadrFormula;  S:double;

begin

   SIntegr:=TLpr.Create(f,'Levix pr');

   S:= SIntegr.IntegrSum(0.,1.,5);

   writeln(SIntegr.Method,S);

   SIntegr1:=TRpr.Create(f,'pravix pr');

   S:= SIntegr.IntegrSum(0.,1.,5);

   writeln(SIntegr1.Method,S);

   readln;

end.

В данной программе вводится класс квадратурных формул TkvadrFormula, который соответствует большой квадратурной формуле. Тип квадратурной формулы уточняется в дочерних классах – TLpr, TRpr, TSpr и Ttrapecia, которые соответствуют квадратурным формулам левых, правых, средних прямоугольников и квадратурной формуле трапеций соответственно. В каждом из них строится соответствующая малая квадратурная формула, который затем используется в унаследоваемом методе построения большой квадратурной формулы IntegrSum. В качестве подынтегральной функции выбрана функция . Количество узлов 5. Количество узлов задается при обращении, но не представляет труда видоизменить программу так, чтобы квадратурная формула вычисляла интеграл с заданной точностью. В конструктор метода передается подынтегральная функция (важно!) и строка, где записывается название применяемой формулы. В примере рассмотрены объекты SIntegr,SIntegr1, которые реализуют формулы левых и правых прямоугольников. При запуске программы получается следующий результат:

 

Levix pr 3.74017247479654E-0001

Pravix pr 3.74017247479654E-0001

 

Анализ и оценка разработки

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

Заключение

В статье описан способ реализации квадратурных формул, отвечающий идеям объектно-ориентированного программирования. Идеи могут быть использованы как для обучения основам объектно-ориентированного программирования, так и при выполнении лабораторных работ по вычислительной математике. Соответствующая программа реализована на DELPHI в консольном режиме, что позволяет концентрировать внимание именно на идеях ООП.

Литература

1.       Нуриев Н.К. Объектно-ориентированный подход в дидактике программной инженерии с диагностикой эффективности подготовки и переподготовки кадров // Вестник Казан. гос. технол. ун-та. – 2005. – № 1. – С. 436 – 443.

2.       Нуриев Н.К. Модель подготовки инженера на основе компетентностного подхода и принципа природосообразности (монография) // Educational Technology & Society – 2009 (http://ifets.ieee.org/russian/periodical/journal.html) - V.12. - N 1. - 62 c. – ISSN 1436-4522.

3.       Нуриев Н.К., Старыгина С.Д., Титов А.Н., Пашукова Е.В. Подготовка инженеров в дидактических системах нового поколения // Educational Technology & Society – 2011 (http://ifets.ieee.org/russian/periodical/journal.html) - V.14. - N 4. – С. 386-403 c. – ISSN 1436-4522.

4.       Барков И.А. Преподавание дисциплины «Объектно-ориентированное программирование» // Международный электронный журнал "Образовательные технологии и общество (Educational Technology & Society)". 2010. V.12. №4. –ISSN 1436-4522.

5.       Березин И.С., Жидков Н.П. Методы вычислений, т.1. М.: ГФМЛ.1962.- 464 с.

6.       Евдокимов А.В. Объектно-ориентированный подход в вычислительной математике и имитационном моделировании. Маг. дис. М., 2000.-87 с. URL:http://lib.znate.ru/docs/index-119231.html (дата обращения 14.06.2013).

7.       Тан К.Ш., Стиб В.-Х., Харди Й. Символьный С++: Введение в компьютерную алгебру с использованием объектно-ориентированного программирования: Пер. со 2-го англ. изд.- М.:Мир. 2001.-622с., ил.

8.       Шамин Р.В. Современные численные методы в объектно-ориентированном изложении на C#. 298 c. URL:http://www.twirpx.com/file/770911/ (дата обращения 14.06.2013).