Проект программного модуля для нахождения корня уравнения
Проект программного модуля для нахождения корня уравнения
Содержание Введение 2 1. Постановка задачи 3 1.1 Математическая модель задачи 3 1.2 Входные данные 6 1.3 Выходные данные 6 1.4 Обработка ошибок. 6 2 Проектирование программного модуля 8 2.1 Структурная диаграмма программного модуля 8 2.2 Разработка схемы программного модуля и её описание 9 2.3 Разработка пользовательского интерфейса 10 3 Реализация программного модуля 12 3.1 Код программы 12 4 Тестирование программного модуля 18 Заключение 19 Список использованных источников 21 Введение Целью данной курсовой работы является разработка программного модуля для нахождения методом хорд корня уравнения 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) принимает значения с разными знаками. Заканчиваем процесс уточнения корня, когда расстояние между очередными приближениями станет меньше заданной точности |xn - xn-1| < или когда значения функции f(x) попадут в область шума (рисунок 1), т. е. |f(xn)| < 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) При заданной точности метод состоит из таких шагов: Вычислить 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| ( - заданная погрешность вычислений) или |f(x1)| < 1 (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.
|