Зміст
Введення
1. Постановка завдання
1.1 Математична модель задачі
1.2 Вхідні дані
1.3 Вихідні дані
1.4 Обробка помилок.
2 Проектування програмного модуля
2.1 Структурна діаграма програмного модуля
2.2 Розробка схеми програмного модуля та її опис
2.3 Розробка користувальницького інтерфейсу
3 Реалізація програмного модуля
3.1 Код програми
4 Тестування програмного модуля
Висновок
Список використаних джерел
Введення
Метою даної курсової роботи є розробка програмного модуля для знаходження методом хорд кореня рівняння x3 - x - 0.3 = 0 з точністю до 0,001. Для розробки використовується табличний процесор Excel і мова програмування Visual Basic for Application.
1. Постановка завдання
1.1 Математична модель задачі
Розглянутий метод так само, як і метод розподілу відрізка навпіл, призначений для уточнення кореня на інтервалі [a, b], на кінцях якого ліва частина рівняння f (x) = 0 приймає різні знаки. Значення початку інтервалу а вводиться з клавіатури. Для визначення значення кінця інтервалу b, на якому функція змінює знак, при заданому значенні початку відрізка а використовують наступний ітераційний алгоритм:
Задають початкове значення
х = a + h.
Тут h - це заданий крок зміни х.
Обчислити значення f (a) і f (x).
Якщо f (a) і f (x) мають різні знаки, то прийняти b = x і припинити обчислення, інакше прийняти
x = x + h
і перейти до кроку 2.
Чергове наближення тепер на відміну від методу розподілу відрізка навпіл беремо не в середині відрізка, а в точці х1, де перетинає вісь абсцис пряма лінія, проведена через точки f (a) і f (b) (малюнок 1).
В якості нового інтервалу для продовження ітераційного процесу вибираємо той з двох [a, x1] або [x1, b], на кінцях якого функція f (x) приймає значення з різними знаками. Закінчуємо процес уточнення кореня, коли відстань між черговими наближеннями стане менше заданої точності e
| Xn - xn-1 | <e
або коли значення функції f (x) потраплять в область шуму (рисунок 1), т. е.
| F (xn) | <e 1.
Малюнок 1. Метод хорд.
Рівняння прямої лінії, що проходить через точки fa = f (a) і fb = f (b), запишемо в загальному вигляді
y (x) = kx + c.
Коефіцієнти k і c рівняння цієї прямої визначимо з умов
fa = ka + c,
fb = kb + c.
Віднімаючи ліві і праві частини останніх співвідношень, отримаємо
,
c = fa - ka.
Точку перетину прямої y (x) з віссю абсцис отримаємо, прирівнюючи y (x) нулю
(1)
або
. (2)
При заданій точності e метод складається з таких кроків:
Обчислити f (a) і f (b).
Обчислити x1 за формулою (1) або за формулою (2).
Якщо f (x1) = 0, то прийняти як рішення значення x1, вивести його і припинити обчислення, інакше перейти до кроку 4.
Якщо f (x1) і f (a) мають однакові знаки, то замінити a на x1.
Якщо f (x1) і f (b) мають однакові знаки, то замінити b на x1.
Якщо | b - a | £ e (e - задана похибка обчислень) або | f (x1) | <e 1 (e 1 - задане значення шуму), то прийняти як рішення останнє значення x1, вивести його і припинити обчислення, в Інакше перейти до кроку 2.
1.2 Вхідні дані
Вхідними даними є:
Початок відрізка;
Кінець відрізка;
Вимоги до вхідних даних:
Передбачити перевірку на допустимість вихідних даних і повторення введення при помилкових даних;
Введення вихідних даних здійснювати в поля введення форми.
1.3 Вихідні дані
Вихідними даними є:
Таблиця обчислень;
Графік функції.
Вимоги до вихідних даних:
Всі вихідні дані виводяться на форму;
До всіх вихідних даних повинен бути заборонений доступ з боку користувача.
1.4 Обробка помилок
У даній програмі реалізований наступний спосіб контролю введення:
Спочатку перевіряється, чи є набраний символ або цифрою, або комою;
Якщо не є, то набір символу ігнорується;
Якщо набирається символ є цифрою, то він вводиться в поле введення;
Якщо набирається символ є коми, то перевіряється, чи є
вона першою вводиться коми. Якщо раніше коми не вводилися, то вона вводиться в поле введення. В іншому випадку введення коми ігнорується.
Даний спосіб контролю введення реалізований за допомогою функції KeyPress.
Проте користувач може не ввести в поле введення дані. У цьому випадку видається наступне повідомлення:
Малюнок 2. Повідомлення про помилку.
Якщо користувач ввів початок відрізка більше, ніж кінець відрізка, то в цьому випадку видається наступне повідомлення:
Малюнок 3. Повідомлення про помилку.
2 Проектування програмного модуля
2.1 Структурна діаграма програмного модуля
Малюнок 4. Структурна діаграма програмного модуля.
UserForm1 - призначена для користувача форма.
UserForm_Initialize () - процедура початкової ініціалізації користувача форми.
CommandButton1_Click () - процедура, що спрацьовує при натисканні кнопки «Знайти коріння», яка робить обчислення і записує результат.
CommandButton3_Click () - процедура, що спрацьовує при натисканні кнопки «Про програму», яка виводить інформацію про завдання і про розробника.
CommandButton4_Click () - процедура, що спрацьовує при натисканні кнопки «Очистити», що видаляє побудований графік.
CommandButton5_Click () - процедура, що спрацьовує при натисканні кнопки «Побудувати», яка прочитує дані і будує графік.
f () - функція, яка обчислює значення функції в залежності від аргументу.
2.2 Розробка схеми програмного модуля та її опис
Малюнок 5. Схема процедури обробки кнопки «Знайти коріння».
Позначення змінних:
x1 - число з [a, b], для якого обчислюється значення функції;
a, b - початок і кінець відрізка;
i - лічильник ітерацій.
2.3 Розробка користувальницького інтерфейсу
При запуску програми з'являється наступне вікно:
Малюнок 6. Вікно програми.
У вікні програми розташовані 2 закладку Page1 - «Обчислення» і Page2 - «Побудова графіка».
На закладці «Обчислення» розташовані вихідні дані в елементі управління Label, результат (елемент управління Label) і самі обчислення на елементі управління ListBox.
Після натискання на кнопку «Знайти коріння» проводиться розрахунок і виводиться результат.
Після натискання на кнопку «Про програму» з'являється повідомлення з даними про завдання, яке вирішує дана програма і про розробника.
Малюнок 7. Повідомлення «Про програму».
На закладці «Побудова графіка» осередки для введення відрізка (елемент управління TextBox), на якому буде побудований графік (для уточнення кореня рівняння), і сам графік. Графік виводиться на елемент управління Image.
3 Реалізація програмного модуля
3.1 Код програми
Dim a As Double 'початок відрізка
Dim b As Double 'кінець відрізка
Dim x1 As Double 'значення аргументу
Dim x2 As Double 'значення аргументу
Dim i As Integer 'рахівник
Dim number As String 'рядок для перевірки вводиться числа
Dim sign As String 'рядок для перевірки знака вводиться числа
Dim k As Integer
Dim j As Double
Dim ry As Range 'область даних по y для побудови графіка
Dim rx As Range 'область даних по x для побудови графіка
Private Sub UserForm_Initialize ()
Application.Visible = False 'робимо Excel невидимим
number = "0123456789, -"
sign = "-"
Image1.Visible = False
CommandButton4.Enabled = False
End Sub
Private Sub CommandButton1_Click ()
ListBox1.Clear
a = -5 'присвоєння значення
b = 5 'присвоєння значення
i = 1 'присвоєння значення
ListBox1.AddItem "x" 'заповнення ListBox1
ListBox1.List (0, 1) = "y (x)" 'заповнення ListBox1
Do While (True)
x2 = x1
x1 = a - ((b - a) / (f (b) - f (a))) * f (a)
ListBox1.AddItem x1 'заповнення ListBox1
ListBox1.List (i, 1) = f (x1) 'заповнення ListBox1
i = i + 1
If (f (x1) = 0) Then 'перевірка умови
Exit Do 'вихід з циклу
End If
If ((f (x1) * f (a))> 0) Then 'перевірка умови
a = x1 'зміна початку відрізка
End If
If ((f (x1) * f (b))> 0) Then 'перевірка умови
b = x1 'зміна кінця відрізка
End If
If (Abs (x2 - x1) <= 0.001) Then 'перевірка умови
Exit Do 'вихід з циклу
End If
Loop
Label4.Caption = x1
End Sub
Private Sub CommandButton3_Click ()
MsgBox "Програма уточнення кореня рівняння x ^ 3-x-0, 3 = 0 методом хорд." & VbCr & "Розробник програми: Шаравара Д.", vbInformation, "Про програму"
End Sub
Private Sub CommandButton4_Click ()
TextBox1.Value = ""
TextBox2.Value = ""
Image1.Visible = False
CommandButton5.Enabled = True
CommandButton4.Enabled = False
End Sub
Private Sub CommandButton5_Click ()
'Перевіряємо чи введені всі дані
If (TextBox1.Value = "" Or TextBox2.Value = "") Then
MsgBox ("Введіть початок і кінець відрізка!")
Exit Sub
End If
'Перевіряємо чи правильно введені дані (a <b)
If (CDbl (TextBox1.Value)> = CDbl (TextBox2.Value)) Then
MsgBox ("Перевірте введені дані!")
Exit Sub
End If
k = 1
For j = CDbl (TextBox1.Value) To CDbl (TextBox2.Value) Step 0.01
Cells (k, 1) = j
Cells (k, 2) = f (j)
k = k + 1
Next j
Set ry = Sheets (ActiveSheet.Name). Range (Cells (1, 2), Cells (k, 2))
Set rx = Sheets (ActiveSheet.Name). Range (Cells (1, 1), Cells (k, 1))
Charts.Add
ActiveChart.ChartType = xlLine
ActiveChart.SetSourceData Source: = ry, PlotBy: = xlColumns
ActiveChart.SeriesCollection (1). XValues = "=" & rx.Address (ReferenceStyle: = xlR1C1, external: = True)
ActiveChart.Location Where: = xlLocationAsObject, Name: = "Лист1"
With ActiveChart
. HasTitle = False
. Axes (xlCategory, xlPrimary). HasTitle = False
. Axes (xlValue, xlPrimary). HasTitle = False
End With
With ActiveChart.Axes (xlCategory)
. HasMajorGridlines = False
. HasMinorGridlines = False
End With
With ActiveChart.Axes (xlValue)
. HasMajorGridlines = False
. HasMinorGridlines = False
End With
ActiveChart.HasLegend = False
ActiveChart.HasDataTable = False
ActiveChart.Export Filename: = CurDir + "\ Grafic_func.gif", FilterName: = "GIF"
ActiveSheet.ChartObjects.Delete
Worksheets (1). UsedRange.Clear
Image1.Picture = LoadPicture (CurDir + "\ Grafic_func.gif") 'завантажуємо в Image1 файл з графіком
Image1.Visible = True
CommandButton5.Enabled = False
CommandButton4.Enabled = True
End Sub
Public Function f (x As Double) As Double 'перебування значення функції
f = x ^ 3 - x - 0.3
End Function
Private Sub TextBox1_KeyPress (ByVal KeyAscii As MSForms.ReturnInteger) 'Перевірка вводу
If KeyAscii> 26 Then
If InStr (number, Chr (KeyAscii)) = 0 Or (InStr (TextBox1.Text, ",")> 0 And Chr (KeyAscii) = ",") Or (TextBox1.SelStart> 0 And InStr (sign, Chr ( KeyAscii))> 0) Then
KeyAscii = 0
End If
End If
End Sub
Private Sub TextBox2_KeyPress (ByVal KeyAscii As MSForms.ReturnInteger) 'Перевірка вводу
If KeyAscii> 26 Then
If InStr (number, Chr (KeyAscii)) = 0 Or (InStr (TextBox2.Text, ",")> 0 And Chr (KeyAscii) = ",") Or (TextBox2.SelStart> 0 And InStr (sign, Chr ( KeyAscii))> 0) Then
KeyAscii = 0
End If
End If
End Sub
Private Sub UserForm_QueryClose (Cancel As Integer, CloseMode As Integer) 'Закриття форми
Select Case MsgBox ("Закрити вікно?", VbYesNo + vbQuestion, "Завершення роботи")
Case vbYes
Cancel = 0
Application.Quit
Case vbNo
Cancel = -1
End Select
End Sub
4 Тестування програмного модуля
Знайдемо корінь рівняння. Натиснемо на кнопку «Знайти коріння». Після цього з'явиться результат і проміжні обчислення.
Малюнок 8. Закладка «Обчислення».
Малюнок 9. Графік функції.
Для перевірки кореня, побудуємо графік функції на відрізку [1,1.3] (рис. 9)
Висновок
Метою даної курсової роботи є розробка програмного модуля для знаходження методом хорд кореня рівняння x3 - x - 0.3 = 0 з точністю до 0,001.
Тестування показало, що результати, отримані розробленим програмним модулем, відповідають теоретичним розрахункам (це підтверджує і графік). У програмі присутній обробка помилок. При введенні помилкові дані ігноруються, а за відсутності введених даних видається повідомлення про помилку. Курсова виконана в повному обсязі та у відповідності із завданням.
Список використаних джерел
1 Біллінг В.А. VBA і Office 2000. Офісне програмування. - М.: «Російська редакція», 1999.
2 Гарнаєв Ю.А. Використання MS Excel і VBA в економіці та фінансах. - СПб: БХВ - Санкт-Петербург, 2002.
3 Гарнаєв Ю.А. самовчитель VBA. - СПб: БХВ - Санкт-Петербург, 2002.
4 Васильєв А. VBA в Office 2000: навчальний курс - СПб: Питер, 2002.
5 Кузьменков В.Г. VBA 2002. - М.: Видавництво БІНОМ, 2002.
6 MS Office XP: Розробка додатків / Под ред. Ф. А. Новікова - СПб: БХВ - Санкт-Петербург, 2003.