Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
posobie_po_informatike_Chast1_Word.doc
Скачиваний:
86
Добавлен:
10.02.2015
Размер:
25.57 Mб
Скачать

Программная реализация метода бисекции

Function F (Byval x As Single) As Single

F=(x–1)^2–1

End Function

Private Sub Расчёт (Byval xn As Single, Byval xk As Single, └┘

Byval e As Single, ByRef x As Variant)

Dim N As Integer, c As Single ‘Объявление локальных переменных

Dim mas () ‘Объявление динамического массива

If F(xn)*F(xk)>0 Then

x =”?”

MsgBox ”на данном интервале корня нет или четное кол-во корней.”└┘

+ Chr(13) └┘ &└┘

”Задайте интервал, содержащий один корень”

Exit Sub

End If

N=0

c=(xn+xk)/2

Do While xk-xn>℮ And Abs(F(c))> ℮

c=(xn+xk)/2

N=N+1

ReDim Preserve mas (1 Tо N)

mas (N) =C

If F(xn)*F(c)>0 Then xn=c Else xk=c

Loop

x=c

If N=0 Then

ReDim Preserve mas(1 To 1)

mas (1)=x

End If

List1.List=mas

End Sub

Private Sub Cmd Решение _Click( )

Dim a As Single, b As Single, eps As Single, └┘––

корень As Variant

a=CSng(Text1.Text)

b=CSng(Text2.Text)

eps=CSng(Text3.Text)

Расчет a, b, eps, корень

Text4.Text = корень

End Sub

Private Sub List1_Click()

Text5.Text=F(CSng(List1))

End Sub

Пояснения

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

Проект реализован структурированной программой. В главной (командной) подпрограмме с именем “CmdРешение” выполняется считывание с полей формы (ввод) основных исходных данных, вызов вспомогательной подпрограммы с именем “Расчет” и передача в поле формы (вывод) вычисленного значения корня.

В структуре программы содержатся описания

  • функции с именем “F”, лежащей в основе уравнения;

  • вспомогательной подпрограммы с именем “Расчет”;

  • дополнительной подпрограммы с именем “List1”, передающей в поле формы значения функции при последовательных приближениях к корню.

Алгоритм метода поиска корня формально описан во вспомогательной подпрограмме с именем “Расчет”.

При записи в подпрограмме оператора цикла Do…Loop со служебным словом While (пока), помещённым в начале, составное условие для входа и продолжения цикла должно быть истинным, когда длина интервала поиска и значение функции в пробной (центральной) точке больше допустимой погрешности. Такое соединение условий реализуется логической операцией “And” (“и”).

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

Последняя ситуация (нет входа в цикл) приводит к неопределенности динамического массива с именем “mas”, содержащего приближения к корню (координаты центральных точек интервала поиска) и наращиваемого по длине по мере надобности (количество элементов определяется счётчиком N). Если не было входа в цикл (N=0), то искусственно массив формируется из одного элемента, которому передается значение координаты первой пробной точки, являющейся точкой корня.

Динамический массив “mas” определяется в два этапа: сначала в инструкции “Dim” с помощью двух подряд круглых скобок (открывающей и закрывающей), помещаемых после имени массива, принципиально объявляется массив; далее в цикле с помощью инструкции “ReDim” (Return Dimension – возврат к определению размерности) задаются границы нумерации элементов массива. Служебное слово “Preserve” является обязательным, без этого слова значения элементов массива не сохраняются в памяти.

В подпрограмме “Расчет” (в самом её начале) проверяется условие локализации. В условном операторе, выполняющем эту проверку, фигурирует обратное условие. Если оно истинно, то выводится соответствующее сообщение и выполняется выход (Exit) из подпрограммы. А перед этим величине “x” (переменной универсального типа Variant, соответствующей фактическому параметру “корень”), присваивается значение некоторой символьной константы (символы помещаются в кавычки, например, “???”; возможна пустая строка – двое кавычек (открывающих и закрывающих) подряд; тогда на форме проекта поле значения корня будет пустым). Если бы определить формальную переменную “x” и соответствующую ей в главной подпрограмме фактическую переменную “корень” как числовую, а при отсутствии корня в интервале поиска не присвоить этой переменной никакого значения, то в поле вывода автоматически был бы вывод значения “0” (ноль), что не соответствует истине.

Дополнительно в данный проект включена возможность наблюдать за процессом последовательных приближений к корню. Для этого в подпрограмме расчёта накапливается упомянутый выше массив “mas”. В конце данной подпрограммы этот массив передается на форму в списковое поле с именем “List1” (стандартное имя ListBox). В программу ещё включена возможность отображать на форме значения функции при отдельных значениях приближений к корню. Это реализуется в подпрограмме с именем “List1”. Она выполняется при щелчке ЛКМ на выбранной строке в поле “List1”. Значение, отображённое символами в строке, считывается и в преобразованном числовом виде передаётся как аргумент функции с именем “F”, определяющей выражение уравнения, а вычисленное значение функции выводится на форму в поле с именем “Text5”.

В качестве примера в данном проекте взято уравнение, выражающееся функцией f(x)=(x-1)^2-1 и имеющее два корня: x1=0 и x2=2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]