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

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 25.03.2015
Размер файла 511,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту (работе) по Информатике
На тему: Использование принципов объектно-ориентированного программирования на примере численных методов (вычисление алгебраического уравнения методом половинного деления, интегрирование по общей формуле трапеции, решение дифференциального уравнения методом Эйлера)

СОДЕРЖАНИЕ

Введение

1. Постановка задачи

2. Математическое описание методов

2.1 Метод половинного деления при приближенном вычислении алгебраических и трансцендентных уравнений

2.2 Вычисление общей формулы трапеции

2.3 Решение дифференциального уравнения методом Эйлера

3. Блок-схема программы MAIN

3.1 Блок-схема метода половинного деления объекта Tpolde

3.2 Блок-схема метода трапеции объекта Tmettrap

3.3 Блок-схема метода Эйлера объекта Teyler

3.4 Диаграмма классов главной программы

3.5 Диаграмма взаимодействий главной программы

4. Описание стандартных модулей

5. Описание не стандартных модулей

5.1 Метод poldel

5.2 Метод mettrap

5.3 Метод eyler

6. Описание интерфейса

7. Численные примеры

Заключение

Список используемой литературы

Приложение

Введение

Курсовая работа посвящена программной реализации трёх численных методов. В качестве языка программ курсовой работы выбран язык Паскаль. Выше упомянутый язык программирования предельно прост, логичен и эффективен. В Паскале сконцентрированы многие лучшие черты языков - предшественников. Сравнение этого языка с более простыми языками вроде Бейсика показывает, что текст алгоритма в виде программы на Бейсике содержит больше подробностей о действиях ПЭВМ, текст на Паскале яснее выражает математическую сущность алгоритма. Язык предоставляет пользователю большие возможности для решения широкого круга задач. Он содержит полный набор структур данных: простые переменные (целые, действительные, символьные, логические), массивы, строки, множества, записи и файлы.

Хотелось бы отметить, что методы объектно-ориентированного программирования позволяют создавать расширяемые системы (extensible systems). Это одно из самых значительных достоинств ООП и именно оно отличает данный подход от традиционных методов программирования. Расширяемость extensibility означает, что существующую систему можно заставить работать с новыми компонентами, причем без внесения в нее каких-либо изменений. Компоненты могут быть добавлены на этапе выполнения. Расширение типа type extension и вытекающий из него полиморфизм переменных оказываются полезными преимущественно в обработке разнородных структур данных, в изменении поведения во время выполнения, в реализация родовых компонентов.

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

1. Постановка задач

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

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

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

1.3 Составить программу для вычисления дифференциального уравнения методом Эйлера , y(0,5)=0,5 [0,5;3,5] h=0,3 и описать выше указанный метод, составить блок-схему программы, описать стандартные и не стандартные функции, применяемые в задаче, описать интерфейс и привести пример.

2

2. Математическое описание методов

2.1 Метод половинного деления при приближенном вычислении алгебраических и трансцендентных уравнений

Пусть корень уравнения f(x)=0 отделен на отрезке [a, b], т.е. f(a)f(b)<0 и f '(x) сохраняет знак (рис. 1).

Рисунок 1 - График функции y=f(x).

В качестве начального приближения корня возьмем точку c0 - середину отрезка:

Если , то - искомый корень уравнения, если ,

то из двух отрезков [a, ] и [, b] выбираем тот, на концах которого функция принимает значение разных знаков.

Новый отрезок опять делим пополам и далее поступаем аналогично вышеизложенному. Длина каждого нового отрезка вдвое меньше длины предыдущего отрезка, т.е. за n шагов сократится в раз.

Вычисления прекращаем, если длина отрезка [,], станет меньше заданной погрешности , т.е.:

Достоинство метода половинного деления : более быстрая сходимость к заданной точности, чем у шагового. Недостаток: если на отрезке [а, b] содержится более одного корня, то метод не работает [1].

2.2 Вычисление определенного интеграла по формуле трапеции

Пусть требуется вычислить интеграл , где f(x) - непрерывная функция. Для простоты рассуждений ограничимся случаем, когда . Разобьем отрезок [a, b] на n отрезков точками и с помощью прямых построим n прямолинейных трапеций. Сумма площадей трапеций приближенно равна площади криволинейной трапеции, где и - соответственно основания трапеций; - их высоты. Таким образом, получена приближенная формула:

которая и называется формулой трапеций. Эта формула тем точнее, чем больше n [1].

эйлер программирование численный

2.3 Метод Эйлера для вычисления дифференциального уравнения

Решить дифференциальное уравнение у/=f(x,y) численным методом - это значит для заданной последовательности аргументов , …, и числа , не определяя функцию у=f(x), найти такие значения , ,…,, что и F()=.

Таким образом, численные методы позволяют вместо нахождения функции У=f(x) получить таблицу значений этой функции для заданной последовательности аргументов. Величина называется шагом интегрирования.

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

Рассмотрим дифференциальное уравнение первого порядка с начальным условием x=, y()= Требуется найти решение уравнения на отрезке [а,b]. Разобьем отрезок [a, b] на n равных частей и получим последовательность ,, ,…, , где =+ih (i=0,1,…, n), а -шаг интегрирования.

В методе Эйлера приближенные значения у()() вычисляются последовательно по формулам +hf(,) (i=0,1,2…). При этом искомая интегральная кривая у=у(х), проходящая через точку (,), заменяется ломаной … с вершинами (,) (i=0,1,2,…); каждое звено этой ломаной, называемой ломаной Эйлера, имеет направление, совпадающее с направлением той интегральной кривой уравнения, которая проходит через точку . Если правая часть уравнения в некотором прямоугольнике удовлетворяет условиям:

(N=const),

(M=const), то имеет место следующая оценка погрешности:

|y()-|, где у()-значение точного решения уравнения при х=, а -приближенное значение, полученное на n-ом шаге.

Метод Эйлера легко распространяется на системы дифференциальных уравнений и на дифференциальные уравнения высших порядков. Последние должны быть предварительно приведены к системе дифференциальных уравнений первого порядка [1].

3 Блок-схема программы main

Рисунок 2 - Блок-схема главной программы.

3.1 Блок-схема метода половинного деления объекта Tpoldel

Рисунок 3 - Блок-схема метода половинного деления.

3.2 Блок-схема метода трапеции объекта Tmettrap

Рисунок 4 - Блок-схема метода трапеции.

3.3 Блок-схема метода Эйлера объекта Teyler

Рисунок 5 - Блок-схема метода Эйлера.

3.4 Диаграмма классов главной программы

Диаграмма 1 - Диаграмма классов главной программы.

3.5 Диаграмма взаимодействий главной программы

Диаграмма 2 - Диаграмма взаимодействий главной программы.

4. Описание стандартных функций

Все создаваемые модули используют процедуру Clrscr стандартного модуля Crt [4]. Указанная процедура очищает экран и помещает курсор в его верхний левый угол. Действует процедура следующим образом: все символы заменяются на пробел с атрибутами, установленными в данный момент. Например, если цвет фона TextBackground не черный, то экран будет иметь цвет фона. Процедура выполняется в том окне, в котором она вызвана. Например, в случае

Window (1,1,60,20);

Clrscr;

Будет очищен прямоугольник 60*20, начинающийся в (1,1).

Следующие задействованные всеми создаваемыми модулями процедуры: Write (), Writeln (), Read (), Readln () стандартного модуля System [5]. Объявление этого модуля утилитой Uses не обязательно, он автоматически подключается программными средствами Pascal. Перечисленные операторы являются операторами ввода, вывода. Привлечение этих процедур открывает возможность многократного использования одной и той же программы для вычисления с различными исходными данными [2].

При выполнении оператора ввода Read() переменным присваиваются значения исходных данных [2].

Процедура Readln() выполняет процедуру Read(), после чего переходит на следующую строку. Readln() без параметров осуществляет переход на начало следующей строки без предварительного считывания [2].

С помощью процедур вывода Write() строится последовательность значений, которая является результатом выполнения программы. Параметр, заключенный в круглые скобки может содержать указания ширины поля и количества десятичных знаков. Выражения вывода могут быть следующих типов: char, integer, real, string, packet string или boolean. Процедура вывода, таким образом, позволяет выделить из всего набора вычисленных значений те, которые служат ответом к решавшейся при выполнении программой задаче [2].

Процедура Writeln() выполняет процедуру Write(), а затем осуществляет переход в начало следующей строки. Процедуры ввода и вывода часто применяют вместе. Например, для ввода трех чисел и вывода их суммы

Read (a,b,c);

х:= a+b+c;

Write(x);

Последней общей для всех модулей функцией является функция ReadKey, которая считывает символ с клавиатуры [5]. Она описана в стандартном модуле Crt. Возвращаемый тип данных - тип char. Функция ReadKey принимает значение считываемого символа, при этом символ не выводится на экран. Если до обращения к ReadKey значение KeyPressed было равно True, то считывание происходит незамедлительно. В противном случае программа ожидает ввода с клавиатуры. Для считывания кода, соответствующего специальным клавишам, к функции ReadKey необходимо обратиться два раза. (Под специальными, подразумеваются функциональные клавиши, клавиши управления курсором, клавиши, нажатые одновременно с Alt и т.д.). Первый раз функция ReadKey принимает значения #0, а во второй раз - значение расширенного кода, соответствующего данной специальной клавише. Значение #0 не может быть присвоено ReadKey никаким другим способом. Поэтому если ReadKey = #0, то следующее значение ReadKey обязательно должно трактоваться как расширенный код. Не смотря на то, что применение функции очень широко, однако чаще всего она используется для задержки программы при отладке. Пример применения функции

Ch: = ReadKey - возвращает считанный символ.

И, наконец, последняя, стандартная функция, используемая только в модуле myiter1. Это функция Abs() - возвращающая абсолютное значение аргумента. Она входит в состав стандартного модуля System. Возвращаемый тип данных тот же, что и у аргумента (real, integer).Abs(x) - возвращает абсолютное значение х [2].

5. Описание нестандартных функций

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

5.1 Метода половинного деления объект Tpoldel

Процедура poldel содержит пять внутренних переменных типа real, три из них имеют первоначальное значение, также этот объект использует внутреннюю функцию F( ) для расчёта значения функции в точке. Переменной с присваивается значение, численно равное полу сумме переменных а и b. Используя условный оператор if-then мы проверяем условие: значение функции F()в точке a, умноженное на значение функции F( ) в точке c- меньше или равно нулю. Если условие выполняется, используя стандартный модуль присвоения, мы точке b присваиваем значение точки c, иначе точке а присваивается значение точки с. Цикл Repeat-Until позволяет нам добиться нужной точности ответа, так если условие ложно - тело цикла выполняется заново а если условие истинно - цикл завершается. Выше указанный метод использует стандартные процедуры и функции (clrscr, writeln, readln).

5.2 Метод трапеции объект Tmettrap

Данная процедура использует внутренние переменные a,b,k,s,e типа real и использует внутреннюю функцию F( ) для расчёта интеграла. Переменным a,b,e присваивается начальное значение. Переменной s присваивается значение, численно равное полу сумме значений функции в точке a и в точке b. Переменная k равна разности значений a и e. В ходе выполнения цикла while происходит проверка условия (значение переменной k должно быть меньше или равно сумме переменных b и e). Если условие выполняется, переменной k присваивается сумма переменных k (предыдущего) и e, а переменная s становится равна произведению предыдущего значения s на значение функции в точке k. Далее процедура выводит найденные значения на экран монитора. Выше указанный метод использует стандартные процедуры и функции ( clrscr, write, writeln, readln).

5.3 Метода Эйлера объекта Teyler

Эта процедура использует значительно большее количество внутренних переменных (a,b,e,h,k,s,x,y-real,). Кроме того, она использует внутреннюю функцию F() для расчета уравнения с двумя неизвестными. Начальное значение имеют переменные h,b,x,y , каждое последующее значение x и y заданы формулами. В ходе выполнения цикла while происходит проверка условия (значение переменной х должно входить в интервал от 0,5 до 3,5). Если условие выполняется, процедура выводит найденные значения на экран монитора. Выше указанный метод использует стандартные процедуры и функции ( clrscr, writeln, readln).

6. Описание интерфейса

Основная программа MAIN (использующая методы объектно-ориентированного программирования) работает следующим образом. Используя способ запроса, определяет дальнейший ход развития. При получении любого результата отличного от 1,2,3 вновь возвращается на начало программы. Тем самым, исключая возможность ошибочного ввода. При получении ответа соответствующего цифрам 1,2,3 передает управление одному из не стандартных методов, описанных в не стандартных модулях пользователя. При этом выполнение главной программы практически заканчивается за исключением оператора выхода. Управление передается соответственно одному из модулей (modpoldel, modmettrap, modeyler) или другими словами методам пользователя (poldel, mettrap, eyler). Каждый из перечисленных модулей по сути своей представляет отдельную программу, являющуюся составной частью другой. Это позволяет в зависимости от выбора пользователя выполнить тот или иной самостоятельный модуль, входящий в главную программу.

При выборе 1 управление передается модулю modpoldel (метод poldel) выполнение которого приводит к выходу из программы.

Аналогично построены и два других модуля входящих в программу MAIN.

7. Численные примеры

Все выше перечисленное в данной курсовой работе проиллюстрировано на конкретных примерах.

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

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

Для отделения корней уравнения построим график заданной функции на интервале [1;2]. Таблица для построения графика и график функции приведены ниже.

Таблица 1 - Данные для построения графика в заданном интервале.

Х

1

1,1

1,2

1,3

1,4

1,5

1,6

1,7

1,8

1,9

2

У

-8

-7,25

-6,39

-5,42

-4,34

-3,12

-1,78

-0,31

-1,31

-3,08

5

Рисунок 6 - График функции.

Для получения решения в Microsoft Excel спроектируем таблицу 2.

Таблица 2- Решение нелинейного уравнения методом половинного деления.

a

b

(a+b)/2

f(a)

f(b)

F((a+b)/2)

E|a-b|

1

2

1,5

-8

5

-1,5

1

1,5

2

1,75

-3,125

5

0,9375

0,5

1,5

1,75

1,625

-3,125

0,484375

-1,3203125

0,25

1,625

1,75

1,6875

-1,427734375

0,484375

-0,4716797

0,125

1,75

1,6875

1,71875

0,484375

-0,499267578

-0,0074463

0,0625

1,75

1,71875

1,734375

0,484375

-0,014434814

0,23497009

0,03125

1,734375

1,71875

1,726563

0,233211517

-0,014434814

0,10938835

0,015625

1,726563

1,71875

1,722656

0,108950138

-0,014434814

0,04725766

0,0078125

1,722656

1,71875

1,720703

0,047148287

-0,014434814

0,01635674

0,00390625

1,720703

1,71875

1,719727

0,016329415

-0,014434814

0,0009473

0,001953125

1,719727

1,71875

1,719238

0,000940473

-0,014434814

-0,0067472

0,000976563

1,719238

1,719727

1,719482

-0,006748877

0,000940473

-0,0029042

0,000488281

1,719482

1,719727

1,719604

-0,002904629

0,000940473

-0,0009821

0,000244141

1,719604

1,719727

1,719666

-0,000982185

0,000940473

-2,086E-05

0,00012207

Результатом расчетов по таблице получаем значение корня уравнения при заданной точности вычисления . Проведем проверку правильности результата:

5.08553+5,91454-11=0,00007.

Полученное значение показывает, что при заданной погрешности полученный корень уравнения дает результат не превышающий заданную погрешность.

Также в правильности полученного решения можно убедиться анализируя график функции. Как видно из графика функции решение находится где-то в районе 1,7.

2. Вычисление определенного интеграла на отрезке [-3;8] методом трапеции функции вида с использованием математического процессора Maple V. Maple - программный пакет, система компьютерной алгебры. Система Maple предназначена для символьных вычислений, хотя имеет ряд средств и для численного решения дифференциальных уравнений и нахождения интегралов. Численное интегрирование выполняется командой evalf(int(f, x=x1..x2), e) , где e - точность вычислений (число знаков после запятой).

Результатом расчетов в процессоре Maple V получаем определенный интеграл, который равен 179.6666667.

Рисунок 7 - Результат решения с использованием математического процессора Maple V.

3. Решая дифференциальное уравнение методом Эйлера, и зная, что y(0,5)=0,5 [0,5;3,5] h=0,3, получаем таблицу значений и график этой функции для заданной последовательности аргументов при помощи выше описанной программы Microsoft Excel. Таблица для построения графика и график функции приведены ниже.

Таблица 3- Решение дифференциального уравнения методом Эйлера.

x

0,5

0,8

1,1

1,4

1,7

2

2,3

2,6

2,9

3,2

3,5

y

0,5

1,1

1,262

1,369

1,447

1,508

1,555

1,594

1,627

1,654

1,677

Рисунок 8 - График дифференциального уравнения .

Заключение

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

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

Список используемой литературы

1 Бахвалов, Жидков, Кобельков. Численные методы. 2010 год.

2 М.А. Черкасов. Практический курс программирования на ПАСКАЛЕ. Уч. пособие. 2008 год.

3 Епанешников А.Е., Красильников Ю.И. «Программирование в среде турбо Паскаль». М.: Центр МИФИ СП Диалог, 2009.

4 Рудикова Л.В. Microsoft Excel для студента. Уч. пособие. 2012 год.

Приложение

Program glav;

uses crt,modpoldel,modmettrap,modeyler;{объявление модулей}

var n: integer;

j:Tpoldel;

l:Tmettrap;

e:Teyler;

begin

repeat

clrscr;{очистка экрана}

write('Vvedite 1 - poldel,2 - mettrap,3 - eyler ');

read(n);{определение выбора}

if n=1 then j.poldel;{расчет методом половинного деления}

if n=2 then l.mettrap;{расчет по формуле трапеции}

if n=3 then e.eyler;{расчет методом Эйлера}

until (n=1) or (n=2) or (n=3);

end.

unit modpoldel;{модуль половинного деления}

interface

uses crt;

Type

Tpoldel=class

a,b,c,x,e:real;

function F(x:real):real;

procedure poldel;

end;

implementation

function Tpoldel.F(x:real):real;

begin

F:=x*x*x+2*x*x-11;

end;

procedure Tpoldel.poldel;

begin

clrscr;

writeln('Найти корень уравнения x^3+2*x*x-11=0 на интервале [1;2] с точностью 0.0001');

a:=1;

b:=2;

e:=0.0001;

repeat

c:=(a+b)/2;

if F(a)*F(c)<=0 then

b:=c

else

a:=c;

until b-a<e;

x:=(a+b)/2;

writeln('x=',x);

readln;

end;

end.

unit modmettrap;{модуль формула трапеции}

interface

uses crt;

Type

Tmettrap=class

a,b,k,s,e:real;

function F(x:real):real;

procedure mettrap;

end;

implementation

function Tmettrap.F(x:real):real;

begin

F:=x*x;

end;

procedure Tmettrap.mettrap;

begin

clrscr;

a:=-3;

b:=8;

e:=0.0001;

s:=(F(a)+F(b))/2;

k:=a-e;

while k<=b+e do

begin

k:=k+e;

s:=s+F(k);

end;

s:=s*e;

write('S=',s:0:9);

readln

end;

end.

unit modeyler; {модуль Эйлер}

interface

uses crt;

Type

TEyler=class {в другом паскале пишем object}

h,x,y,a,b,k,s,e:real;

function F(x,y:real):real;

procedure eyler;

end;

implementation

function TEyler.F(x,y:real):real;

begin

F:=1/(x*x+y*y);

end;

procedure TEyler.eyler;

begin

clrscr;

h:=0.3;

b:=3.5;

x:=0.5;

y:=0.5;

while x<=b do

begin

writeln('x=',x:0:9,'y=',y:0:9);

y:=y+F(x,y)*h;

x:=x+h;

end;

readln

end;

end.

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.