Программирование и исследование алгоритмов вычисления определенных интегралов

 














Пояснительная записка к курсовой работе:

Программирование и исследование алгоритмов вычисления определенных интегралов

Введение


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


Метод трапеций


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


Рис. 1


Площадь самой левой полоски приближённо равна площади самой левой трапеции, а именно: . Из математических соображений и , а высота трапеции . Значит . Площади всех следующих полосок выразятся аналогичным способом и составят: , , , …, . Чтобы найти площадь интересующей нас криволинейной трапеции необходимо сложить площади всех полосок, которые в свою очередь приближённо равны площадям соответствующих прямолинейных трапеций. Следовательно, площадь криволинейной трапеции, а значит и численное значение заданного интеграла , равны.

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


(1).


Данная формула называется формулой трапеций. Её точность зависит от . Чем больше количество разбиений отрезка интегрирования, тем выше точность вычислений.

Теперь перейдём к заданию: нам необходимо найти толщину слоя меди, выделившейся в результате электролиза водного раствора хлорида меди (II) на катоде. Известна зависимость силы тока от времени . Отсюда имеем . Фактически нам надо оформить функцию вычисления заданного определённого интеграла на Visual Basic 6.0 методом трапеций. Назовём функцию metod_trapec. При вызове функции задаваемыми параметрами будут down_predel=0 - нижний предел интегрирования, up_predel - верхний предел интегрирования (время наблюдения), chislo_razb - число разбиений отрезка интегрирования. Программный код функции будет выглядеть так:

Function metod_trapec(ByVal a As Single, ByVal b As Single, ByVal n As Long) As Doubleh As Singles As Doublei As Long= (b - a) / n= (F(a, Io) + F(b, Io)) * h / 2i = 1 To n - 1= s + F(a + i * h, Io) * hi_trapec = sFunction

__________


Фактические параметры down_predel, up_predel, chislo_razb соответствуют формальным параметрам a, b, n. В основе лежит формула трапеций (1), записанная по-другому:

.


Накапливаем сумму, результат которой и будет искомым значением определённого интеграла. Далее присваиваем имени функции значение переменной s.


Метод Симпсона (метод парабол)


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

Рис. 2


Вычислим площадь под параболой, проходящей через точки и . Уравнение параболы имеет общий вид . Площадь под параболой:


(2).


Парабола проходит через три точки , и , где . Решая систему из трёх уравнений,



получаем: .

Подставляем в формулу (2). Отсюда следует, что , где . Распространяем на весь отрезок:

. Запишем с применением математических операндов:


(3).


Данная формула называется формулой Симпсона. Её точность зависит от . Чем больше количество разбиений отрезка интегрирования, тем выше точность вычислений.

Фактически нам надо оформить функцию вычисления заданного определённого интеграла на Visual Basic 6.0 методом Симпсона. Назовём функцию metod_Simpson. При вызове функции задаваемыми параметрами будут down_predel - нижний предел интегрирования, up_predel - верхний предел интегрирования, chislo_razb - число разбиений отрезка интегрирования. Программный код функции будет выглядеть так:

Function metod_Simpson(ByVal a1 As Single, ByVal b1 As Single, ByVal n As Long) As Doubleh As Singles As Doublei As Longx As Single= (b1 - a1) / n= F(a1, Io) + F(b1, Io) + 4 * F(a1 + h, Io)i = 1 To Int(n / 2) - 1= a1 + 2 * h * i= s + 2 * F(x, Io) + 4 * F(x + h, Io)i_Simpson = s * h / 3Function


Фактические параметры down_predel, up_predel, chislo_razb соответствуют формальным параметрам a, b, n. В основе лежит формула Симпсона. Сумма первых трёх слагаемых в этой формуле является начальным значением переменной . Далее пробегаем по всему отрезку интегрирования, кроме конечных полосок, и накапливаем сумму. В конце умножаем её на . Результат и будет искомым значением определённого интеграла. Далее присваиваем имени функции значение переменной .


Создание приложения


При запуске Microsoft Visual Basic 6.0 автоматически выскакивает окно с предложением создать новый проект Standard EXE. Нажимаем OK. Начнём создание проекта с титульного листа. Для этого в меню Project выберем команду Add Form. В появившемся диалоговом окне выберем Dialog и нажмем OK. В открывшейся форме расставим объекты: Label1, Label2,..., Label8, как показано на рисунке (см. рис. 3).


Рис. 3 Титульный лист

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

Присвоим свойству Caption значение Титульный лист. На кнопку Вход напишем следующий программный код:

Sub OKButton_Click()Dialog.ShowSub


При щелчке на кнопке Вход из памяти выгружается форма Dialog и загружается базовая форма, служащая начальной точкой для всех операций с программой, форма Form1. Для того, чтобы создать форму Form1, в меню Project выполним команду Add Form. В появившемся диалоговом окне выберем Form и нажмем OK. Щёлкнем правой кнопкой мыши на панели инструментов, выберем вкладку Components, загрузим нестандартные инструменты, которые понадобятся в будущем: Microsoft Windows Common Controls 6.0. Присвоим свойству Caption формы Form1 значение Курсовой проект - Тема 7 вариант 9 (нахождение толщины слоя). Создадим меню для проекта. Для этого в меню Tools выполним команду Menu Editor. В появившемся диалоговом окне напишем названия пунктов меню и названия процедур, которые будут запускаться при выполнении команд меню. Редактор меню с введёнными именами представлен на рисунке (см. рис. 4).


Рис. 4 Редактор меню


Опишем, какие процедуры выполняются в каждом пункте меню.

. MnuFileExit - осуществляет выход из приложения.

Sub MnuFileExit_Click()Sub


Рис. 5


. MnuFileSave_rez - осуществляет сохранение результата эксперимента. Результат сохраняется в файле log.txt, куда записывается используемый метод, нижний предел интегрирования, верхний предел интегрирования, количество разбиений отрезка интегрирования, вычисленное значение интеграла, истинное значение интеграла, погрешность вычислений.

Sub MnuFileSave_rez_Click()metod As StringOption1.Value Then= "Метод трапеций"= "Метод Симпсона"If"log.txt" For Output As #1#1, "ОТЧЕТ ПО ВЫПОЛНЕННЫМ ВЫЧИСЛЕНИЯМ"#1, "Используемый метод:", metod#1, "Время наблюдения:", up_predel#1, "Количество разбиений отрезка интегрирования:", chislo_razb#1, "Вычисленное значение интеграла:", znach_integrala#1, "Истинное значение интеграла:", istinnoe_znach_integrala(down_predel, up_predel)#1, "Погрешность вычисления:", Abs(istinnoe_znach_integrala(down_predel, up_predel) - znach_integrala)#1= MsgBox("Отчет сохранен успешно!" & Chr(10) & Chr(13) & "для просмотра отчета: Файл>>Просмотр отчета",, "Отчет")Sub


. MnuFileLook_rez - осуществляет вывод на экран ранее сохранённого результата, если предварительно его сохранили.

Sub MnuFileOpen_rez_Click().Show 1, Form1Sub


При выполнении этой процедуры загружается форма Form3, на которой находится объект PictureBox1, в который выводится сохраненный отчет. Для вывода отчета существует кнопка «Загрузить отчет». Программный код Form3:

stroka As StringSub cmdBack_Click()Form3SubSub cmdLoadLog_Click()Error GoTo Err"log.txt" For Input As #1i = 1 To 8Input #1, stroka.Print strokai#1:Err.Number = 53 Then= MsgBox("Невозможно загрузить результат, ранее не было сохранено результатов!",, "Ошибка")Form3IfSub


В процедуре cmdLoadLog_Click(), проверяется существует ли файл с отчетом, если да то происходит открытие указанного файла, построчное считывание из него и вывод в объект Picture1, если такого файла нет, то об этом пользователя об этом уведомляют. Готовая форма Form3 изображена на рисунке (см. рис. 6). При щелчке на кнопке «Назад» (на объекте cmdBack) происходит выгрузка формы Form3 из оперативной памяти.


Рис. 6

4. MnuHelpAbout - выводит на экран информацию о программе. Вывод осуществляется с помощью формы Dialog2.

Sub MnuHelpAbout_Click().Show 1, Form1Sub


При щелчке на кнопке «OK» (объект Command1) происходит выгрузка формы Dialog2 из оперативной памяти. Готовая форма Dialog2 изображена на рисунке (см. рис. 7).

Программный код формы Dialog2:

Sub OKButton_Click()Dialog2Sub


. MnuMatemFormula - выводит на экран ручной вывод формулы заданного определённого интеграла. Вывод осуществляется с помощью формы Dialog1.

Sub MnuMatemFormula_click().Show 1, Form1Sub


. MnuMatemGrafik_Pogreshn - выводит на экран форму Form2. В ней можно построить график зависимости погрешности заданного метода от количества разбиений отрезка интегрирования.

Sub MnuMatemGrafik_Pogreshn_click().Show 1, Form1Sub


Программный код формы Form2:

i As Longa As Single, b As Single, n As LongIo As SingleFunction istinnoe_znach_integrala(a As Single, b As Single) As Double= 0.15: b0 = 0.1: po = 8600: faradey = 96500: M = 64.5 * 10 ^ (-3)_znach_integrala = Io * M / (2 * 2 * faradey * po * a0 * b0) * (b ^ 3 / 3 - 3 / 2 * b ^ 2 + 9 * b - 27 * Log((b + 3) / 3))FunctionFunction metod_trapec(ByVal a As Single, ByVal b As Single, ByVal n As Long) As Doubleh As Singles As Doublei As Long= (b - a) / n= (F(a, Io) + F(b, Io)) * h / 2i = 1 To n - 1= s + F(a + i * h, Io) * hi_trapec = sFunctionFunction metod_Simpson(ByVal a1 As Single, ByVal b1 As Single, ByVal n As Long) As Doubleh As Singles As Doublei As Longx As Single= (b1 - a1) / n= F(a1, Io) + F(b1, Io) + 4 * F(a1 + h, Io)i = 1 To Int(n / 2) - 1= a1 + 2 * h * i= s + 2 * F(x, Io) + 4 * F(x + h, Io)i_Simpson = s * h / 3FunctionSub Command1_Click()= 2 * 10 ^ 9.Cls= Form1.Text2= 0= Val(Text3.Text)= Val(Text4.Text)= Val(Text5.Text)= Text1Check1.Value = vbChecked Thensave For Output As #1#1, "количество разбиений"; " "; "погрешность метода трапеций"; " "; "погрешность метода Симпсона"#1If= istinnoe_znach_integrala(a, b)= N1= 250 * koeff * Abs(metod_Simpson(a, b, 10) - s)= koeff * Abs(metod_trapec(a, b, 10) - s).Scale (-20, 10)-(N2 + 10, -2)n = N1 To N2 Step 2= metod_Simpson(a, b, n)= metod_trapec(a, b, n)= Abs(s - st)= Abs(s - ss)Check1.Value = vbChecked Thensave For Append As #1#1, " "; n, " "; pogtr, " "; POGss#1If.Line (X0, Y1)-(n, 250 * koeff * POGss), RGB(255, 0, 0).Line (X0, Y2)-(n, koeff * pogtr), RGB(0, 0, 255).Line (-50, 0)-((N2 + 50), 0).Line (0, -30)-(0, 20)= n= 250 * koeff * POGss= koeff * pogtrn <= 30 And n Mod 10 = 0 Then.PSet (-16, koeff * pogtr).Print Format(pogtr, "#.##e-#").Line (-20, koeff * pogtr)-(210, koeff * pogtr), RGB(0, 255, 0)Ifni = 10 To N2 + 50 Step 10.PSet (i, 0).Print i.Line (i, -10)-(i, N2), RGB(0, 255, 0)iSubSub Command2_Click()Form2Sub


Вычисляем погрешность, отнимая полученное значение интеграла от истинного, вычисляемого функцией istinnoe_znach_integrala, находящейся в форме Form1. Затем строим точку на объекте Picture1. При щелчке на кнопке «Назад» (объект Command2) форма Form2 выгружается из оперативной памяти. Готовая форма Form2 изображена на рисунке (см. рис. 8).

Мы рассмотрели все функции и процедуры, используемые в проекте. Теперь можно рассмотреть работу формы Form1. При щелчке на кнопке «Произвести вычисления» (объект Command1) происходит считывание из текстовых полей заданных параметров: время наблюдения, начальное значение силы тока, число разбиений отрезка интегрирования. Далее следует проверка входных данных. Далее идет вычисление интеграла и вывод результата, а также построение графика интегрируемой зависимости силы тока на заданном участке времени. График строится таким образом, что он всегда выводится в центре объекта Picture1. Это достигается тем, что система координат вводится исходя из максимального и минимального значения функции и из величины концов отрезка интегрирования. Для этого мы и ищем y_max и y_min. Далее ставим подписи на концах отрезка интегрирования.


Рис. 8

Программный код формы Form1:

down_predel As Singleup_predel As Singleznach_integrala As Doublechislo_razb As Longi As Single

'Public Io As Singley_max As Singley_min As Single


'Функция вычисления истинного значения интеграла по формуле Ньютона-Лейбница.Function istinnoe_znach_integrala(a As Single, b As Single) As Double

= 0.15: b0 = 0.1: po = 8600: faradey = 96500: M = 64.5 * 10 ^ (-3)_znach_integrala = Io * M / (2 * 2 * faradey * po * a0 * b0) * (b ^ 3 / 3 - 3 / 2 * b ^ 2 + 9 * b - 27 * Log((b + 3) / 3))Function


'Функция вычисления интеграла методом трапеций.

Function metod_trapec(a As Single, b As Single, n As Long) As Doubleh As Singles As Doublei As Long= (b - a) / n= (F(a, Io) + F(b, Io)) * h / 2i = 1 To n - 1= s + F(a + i * h, Io) * hi_trapec = sFunction


'Функция вычисления интеграла методом Симпсона.

Function metod_Simpson(a As Single, b As Single, n As Long) As Doubleh As Singles As Doublei As Longx As Single= (b - a) / n= F(a, Io) + F(b, Io) + 4 * F(a + h, Io)i = 1 To Int(n / 2) - 1= a + 2 * h * i= s + 2 * F(x, Io) + 4 * F(x + h, Io)i_Simpson = s * h / 3FunctionSub Command1_Click()i = 0 To 9.Line (down_predel + i * (up_predel - down_predel) / 10, 0)-(down_predel + i * (up_predel - down_predel) / 10, F(down_predel + i * (up_predel - down_predel) / 10, Io)).Line (down_predel + i * (up_predel - down_predel) / 10, F(down_predel + i * (up_predel - down_predel) / 10, Io))-(down_predel + (i + 1) * (up_predel - down_predel) / 10, F(down_predel + (i + 1) * (up_predel - down_predel) / 10, Io)).Line (down_predel + (i + 1) * (up_predel - down_predel) / 10, F(down_predel + (i + 1) * (up_predel - down_predel) / 10, Io))-(down_predel + (i + 1) * (up_predel - down_predel) / 10, 0)iSub


'Функция выхода из программы

Sub MnuFileExit_Click()SubSub MnuFileOpen_rez_Click().Show 1, Form1Sub


'Сохранения результата в файл log.txtSub MnuFileSave_rez_Click()metod As StringOption1.Value Then= "Метод трапеций"= "Метод Симпсона"If"log.txt" For Output As #1#1, "ОТЧЕТ ПО ВЫПОЛНЕННЫМ ВЫЧИСЛЕНИЯМ"#1, "Используемый метод:", metod#1, "Время наблюдения:", up_predel#1, "Количество разбиений отрезка интегрирования:", chislo_razb#1, "Вычисленное значение толщины слоя:", znach_integrala#1, "Истинное значение толщины слоя:", istinnoe_znach_integrala(down_predel, up_predel)#1, "Погрешность вычисления:", Abs(istinnoe_znach_integrala(down_predel, up_predel) - znach_integrala)#1= MsgBox("Отчет сохранен успешно!" & Chr(10) & Chr(13) & "для просмотра отчета: Файл>>Просмотр отчета",, "Отчет")SubSub MnuHelpAbout_Click().Show 1, Form1SubSub MnuMatemGrafik_Pogreshn_click().Show 1, Form1SubSub cmd_chet_Click()_predel = 0_predel = Val(Text1.Text)= Val(Text2.Text)_razb = Val(Text3.Text).Cls.Clschislo_razb <= 0 Then"Число разбиений отрезка интегрирования должно быть больше нуля.", vbCritical, "Внимание!"SubIfup_predel < 0 Then"Время испытаний не может быть отрицательным", vbCritical, "Внимание!"SubIfOption1.Value Then_integrala = metod_trapec(down_predel, up_predel, chislo_razb)_integrala = metod_Simpson(down_predel, up_predel, chislo_razb)chislo_razb Mod 2 = 1 Then"Число разбиений отрезка интегрирования при данном методе должно быть четным.", vbCritical, "Внимание!"SubIfIf.Caption = "График зависимости силы тока на [" & down_predel & ";" & up_predel & "]".Print znach_integrala.Print istinnoe_znach_integrala(down_predel, up_predel)_max = F(down_predel, Io)_min = F(down_predel, Io)i = down_predel To up_predel Step 0.001F(i, Io) < y_min Then_min = F(i, Io)IfF(i, Io) > y_max Then_max = F(i, Io)Ifi.Cls.DrawWidth = 1.Scale (down_predel - (up_predel - down_predel) / 3, y_max + (y_max - y_min) / 3)-(up_predel + (up_predel - down_predel) / 3, y_min - (y_max - y_min) / 3)


'Рисование осей

.Line (down_predel - (up_predel - down_predel) / 3, 0)-(up_predel + (up_predel - down_predel) / 3, 0).Line (0, y_max + (y_max - y_min) / 3)-(0, y_min - (y_max - y_min) / 3)


'Стрелка на оси OX

.Line (up_predel + (up_predel - down_predel) / 3, 0)-(up_predel + (up_predel - down_predel) / 3 - (up_predel - down_predel) / 24, (y_max - y_min) / 50).Line (up_predel + (up_predel - down_predel) / 3, 0)-(up_predel + (up_predel - down_predel) / 3 - (up_predel - down_predel) / 24, -(y_max - y_min) / 50)


'Стрелка на оси OY

.Line (0, y_max + (y_max - y_min) / 3)-(-(up_predel - down_predel) / 100, y_max + (y_max - y_min) / 3 - (y_max - y_min) / 12).Line (0, y_max + (y_max - y_min) / 3)-((up_predel - down_predel) / 100, y_max + (y_max - y_min) / 3 - (y_max - y_min) / 12)


'Построение графика

.Line (down_predel, F(down_predel, Io))-(down_predel, 0), RGB(255, 0, 0).Line (up_predel, F(up_predel, Io))-(up_predel, 0), RGB(255, 0, 0)i = down_predel To up_predel Step 0.001.PSet (i, F(i, Io)), RGB(0, 0, 255)i

'Левая подпись.CurrentX = down_predel - (up_predel - down_predel) / 40F(down_predel, Io) > 0 Then.CurrentY = -(y_max - y_min) / 25.CurrentY = (y_max - y_min) / 8If.Print down_predel

'Правая подпись.CurrentX = up_predel - (up_predel - down_predel) / 40F(up_predel, Io) > 0 Then.CurrentY = -(y_max - y_min) / 25.CurrentY = (y_max - y_min) / 8If.Print up_predelSub


Заключение


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


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


1. Мастер - Самоучитель по Visual Basic 6.0 AlexSoft 2010 г.

. Информатика. Высшая школа. Острейковский В. А. 2009 г.



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

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ