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

Пояснительная записка

К курсовой работе:

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


Содержание:


Введение

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


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

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

Рис. 1

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

.

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

(1).

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

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

__________

Public Function metod_trapec(ByVal a As Single, ByVal b As Single, ByVal n As Long) As Double

Dim h As Single

Dim s As Double

Dim i As Long

h = (b - a) / n

s = (F(a, Io) + F(b, Io)) * h / 2

For i = 1 To n - 1

s = s + F(a + i * h, Io) * h

Next i

metod_trapec = s

End Function

__________

Фактические параметры 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 – число разбиений отрезка интегрирования. Программный код функции будет выглядеть так:

__________

Public Function metod_Simpson(ByVal a1 As Single, ByVal b1 As Single, ByVal n As Long) As Double

Dim h As Single

Dim s As Double

Dim i As Long

Dim x As Single

h = (b1 - a1) / n

s = F(a1, Io) + F(b1, Io) + 4 * F(a1 + h, Io)

For i = 1 To Int(n / 2) - 1

x = a1 + 2 * h * i

s = s + 2 * F(x, Io) + 4 * F(x + h, Io)

Next i

metod_Simpson = s * h / 3

End Function

__________

Фактические параметры 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 значение “Титульный лист”. На кнопку Вход напишем следующий программный код:

__________

Private Sub OKButton_Click()

Unload Dialog

Form1.Show

End Sub

__________

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

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

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

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

__________

Private Sub MnuFileExit_Click()

End

End Sub

__________

Рис. 5

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

__________

Private Sub MnuFileSave_rez_Click()

Dim metod As String

If Option1.Value Then

metod = "Метод трапеций"

Else

metod = "Метод Симпсона"

End If

Open "log.txt" For Output As #1

Print #1, "ОТЧЕТ ПО ВЫПОЛНЕННЫМ ВЫЧИСЛЕНИЯМ"

Print #1, "Используемый метод:", metod

Print #1, "Время наблюдения:", up_predel

Print #1, "Количество разбиений отрезка интегрирования:", chislo_razb

Print #1, "Вычисленное значение интеграла:", znach_integrala

Print #1, "Истинное значение интеграла:", istinnoe_znach_integrala(down_predel, up_predel)

Print #1, "Погрешность вычисления:", Abs(istinnoe_znach_integrala(down_predel, up_predel) - znach_integrala)

Close #1

a = MsgBox("Отчет сохранен успешно!" & Chr(10) & Chr(13) & "для просмотра отчета: Файл>>Просмотр отчета", , "Отчет")

End Sub

__________

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

___________

Private Sub MnuFileOpen_rez_Click()

Form3.Show 1, Form1

End Sub

____________

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

__________

Dim stroka As String

Private Sub cmdBack_Click()

Unload Form3

End Sub

Private Sub cmdLoadLog_Click()

On Error GoTo Err

Open "log.txt" For Input As #1

For i = 1 To 8

Line Input #1, stroka

Picture1.Print stroka

Next i

Close #1

Err:

If Err.Number = 53 Then

a = MsgBox("Невозможно загрузить результат, ранее не было сохранено результатов!", , "Ошибка")

Unload Form3

End If

End Sub

__________

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

Рис. 6

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

__________

Private Sub MnuHelpAbout_Click()

Dialog2.Show 1, Form1

End Sub

__________

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

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

__________

Private Sub OKButton_Click()

Unload Dialog2

End Sub

__________

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

__________

Private Sub MnuMatemFormula_click()

Dialog1.Show 1, Form1

End Sub

__________

Рис. 7

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

__________

Private Sub MnuMatemGrafik_Pogreshn_click()

Form2.Show 1, Form1

End Sub

__________

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

Dim i As Long

Dim a As Single, b As Single, n As Long

Public Io As Single

Public Function istinnoe_znach_integrala(a As Single, b As Single) As Double

a0 = 0.15: b0 = 0.1: po = 8600: faradey = 96500: M = 64.5 * 10 ^ (-3)

istinnoe_znach_integrala = Io * M / (2 * 2 * faradey * po * a0 * b0) * (b ^ 3 / 3 - 3 / 2 * b ^ 2 + 9 * b - 27 * Log((b + 3) / 3))

End Function

Public Function metod_trapec(ByVal a As Single, ByVal b As Single, ByVal n As Long) As Double

Dim h As Single

Dim s As Double

Dim i As Long

h = (b - a) / n

s = (F(a, Io) + F(b, Io)) * h / 2

For i = 1 To n - 1

s = s + F(a + i * h, Io) * h

Next i

metod_trapec = s

End Function

Public Function metod_Simpson(ByVal a1 As Single, ByVal b1 As Single, ByVal n As Long) As Double

Dim h As Single

Dim s As Double

Dim i As Long

Dim x As Single

h = (b1 - a1) / n

s = F(a1, Io) + F(b1, Io) + 4 * F(a1 + h, Io)

For i = 1 To Int(n / 2) - 1

x = a1 + 2 * h * i

s = s + 2 * F(x, Io) + 4 * F(x + h, Io)

Next i

metod_Simpson = s * h / 3

End Function

Private Sub Command1_Click()

koeff = 2 * 10 ^ 9

Picture1.Cls

Io = Form1.Text2

a = 0

b = Val(Text3.Text)

N1 = Val(Text4.Text)

N2 = Val(Text5.Text)

save = Text1

If Check1.Value = vbChecked Then

Open save For Output As #1

Print #1, "количество разбиений"; " "; "погрешность метода трапеций"; " "; "погрешность метода Симпсона"

Close #1

End If

s = istinnoe_znach_integrala(a, b)

X0 = N1

Y1 = 250 * koeff * Abs(metod_Simpson(a, b, 10) - s)

Y2 = koeff * Abs(metod_trapec(a, b, 10) - s)

Picture1.Scale (-20, 10)-(N2 + 10, -2)

For n = N1 To N2 Step 2

ss = metod_Simpson(a, b, n)

st = metod_trapec(a, b, n)

pogtr = Abs(s - st)

POGss = Abs(s - ss)

If Check1.Value = vbChecked Then

Open save For Append As #1

Print #1, " "; n, " "; pogtr, " "; POGss

Close #1

End If

Picture1.Line (X0, Y1)-(n, 250 * koeff * POGss), RGB(255, 0, 0)

Picture1.Line (X0, Y2)-(n, koeff * pogtr), RGB(0, 0, 255)

Picture1.Line (-50, 0)-((N2 + 50), 0)

Picture1.Line (0, -30)-(0, 20)

X0 = n

Y1 = 250 * koeff * POGss

Y2 = koeff * pogtr

If n <= 30 And n Mod 10 = 0 Then

Picture1.PSet (-16, koeff * pogtr)

Picture1.Print Format(pogtr, "#.##e-#")

Picture1.Line (-20, koeff * pogtr)-(210, koeff * pogtr), RGB(0, 255, 0)

End If

Next n

For i = 10 To N2 + 50 Step 10

Picture1.PSet (i, 0)

Picture1.Print i

Picture1.Line (i, -10)-(i, N2), RGB(0, 255, 0)

Next i

End Sub

Private Sub Command2_Click()

Unload Form2

End Sub

__________

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

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

Рис. 8

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

__________

Dim down_predel As Single

Dim up_predel As Single

Dim znach_integrala As Double

Dim chislo_razb As Long

Dim i As Single

'Public Io As Single

Dim y_max As Single

Dim y_min As Single

'Функция вычисления истинного значения интеграла по формуле Ньютона-Лейбница.

Public Function istinnoe_znach_integrala(a As Single, b As Single) As Double

a0 = 0.15: b0 = 0.1: po = 8600: faradey = 96500: M = 64.5 * 10 ^ (-3)

istinnoe_znach_integrala = Io * M / (2 * 2 * faradey * po * a0 * b0) * (b ^ 3 / 3 - 3 / 2 * b ^ 2 + 9 * b - 27 * Log((b + 3) / 3))

End Function

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

Public Function metod_trapec(a As Single, b As Single, n As Long) As Double

Dim h As Single

Dim s As Double

Dim i As Long

h = (b - a) / n

s = (F(a, Io) + F(b, Io)) * h / 2

For i = 1 To n - 1

s = s + F(a + i * h, Io) * h

Next i

metod_trapec = s

End Function

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

Public Function metod_Simpson(a As Single, b As Single, n As Long) As Double

Dim h As Single

Dim s As Double

Dim i As Long

Dim x As Single

h = (b - a) / n

s = F(a, Io) + F(b, Io) + 4 * F(a + h, Io)

For i = 1 To Int(n / 2) - 1

x = a + 2 * h * i

s = s + 2 * F(x, Io) + 4 * F(x + h, Io)

Next i

metod_Simpson = s * h / 3

End Function

Private Sub Command1_Click()

For i = 0 To 9

Picture3.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))

Picture3.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))

Picture3.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)

Next i

End Sub

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

Private Sub MnuFileExit_Click()

End

End Sub

Private Sub MnuFileOpen_rez_Click()

Form3.Show 1, Form1

End Sub

'Сохранения результата в файл log.txt

Private Sub MnuFileSave_rez_Click()

Dim metod As String

If Option1.Value Then

metod = "Метод трапеций"

Else

metod = "Метод Симпсона"

End If

Open "log.txt" For Output As #1

Print #1, "ОТЧЕТ ПО ВЫПОЛНЕННЫМ ВЫЧИСЛЕНИЯМ"

Print #1, "Используемый метод:", metod

Print #1, "Время наблюдения:", up_predel

Print #1, "Количество разбиений отрезка интегрирования:", chislo_razb

Print #1, "Вычисленное значение толщины слоя:", znach_integrala

Print #1, "Истинное значение толщины слоя:", istinnoe_znach_integrala(down_predel, up_predel)

Print #1, "Погрешность вычисления:", Abs(istinnoe_znach_integrala(down_predel, up_predel) - znach_integrala)

Close #1

a = MsgBox("Отчет сохранен успешно!" & Chr(10) & Chr(13) & "для просмотра отчета: Файл>>Просмотр отчета", , "Отчет")

End Sub

Private Sub MnuHelpAbout_Click()

Dialog2.Show 1, Form1

End Sub

Private Sub MnuMatemGrafik_Pogreshn_click()

Form2.Show 1, Form1

End Sub

Private Sub cmd_chet_Click()

down_predel = 0

up_predel = Val(Text1.Text)

Io = Val(Text2.Text)

chislo_razb = Val(Text3.Text)

Picture1.Cls

Picture2.Cls

If chislo_razb <= 0 Then

MsgBox "Число разбиений отрезка интегрирования должно быть больше нуля.", vbCritical, "Внимание!"

Exit Sub

End If

If up_predel < 0 Then

MsgBox "Время испытаний не может быть отрицательным", vbCritical, "Внимание!"

Exit Sub

End If

If Option1.Value Then

znach_integrala = metod_trapec(down_predel, up_predel, chislo_razb)

Else

znach_integrala = metod_Simpson(down_predel, up_predel, chislo_razb)

If chislo_razb Mod 2 = 1 Then

MsgBox "Число разбиений отрезка интегрирования при данном методе должно быть четным.", vbCritical, "Внимание!"

Exit Sub

End If

End If

Frame3.Caption = "График зависимости силы тока на [" & down_predel & ";" & up_predel & "]"

Picture1.Print znach_integrala

Picture2.Print istinnoe_znach_integrala(down_predel, up_predel)

y_max = F(down_predel, Io)

y_min = F(down_predel, Io)

For i = down_predel To up_predel Step 0.001

If F(i, Io) < y_min Then

y_min = F(i, Io)

End If

If F(i, Io) > y_max Then

y_max = F(i, Io)

End If

Next i

Picture3.Cls

Picture3.DrawWidth = 1

Picture3.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)

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

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

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

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

Picture3.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)

Picture3.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

Picture3.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)

Picture3.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)

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

Picture3.Line (down_predel, F(down_predel, Io))-(down_predel, 0), RGB(255, 0, 0)

Picture3.Line (up_predel, F(up_predel, Io))-(up_predel, 0), RGB(255, 0, 0)

For i = down_predel To up_predel Step 0.001

Picture3.PSet (i, F(i, Io)), RGB(0, 0, 255)

Next i

'Левая подпись

Picture3.CurrentX = down_predel - (up_predel - down_predel) / 40

If F(down_predel, Io) > 0 Then

Picture3.CurrentY = -(y_max - y_min) / 25

Else

Picture3.CurrentY = (y_max - y_min) / 8

End If

Picture3.Print down_predel

'Правая подпись

Picture3.CurrentX = up_predel - (up_predel - down_predel) / 40

If F(up_predel, Io) > 0 Then

Picture3.CurrentY = -(y_max - y_min) / 25

Else

Picture3.CurrentY = (y_max - y_min) / 8

End If

Picture3.Print up_predel

End Sub

__________


Заключение

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


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

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

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

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