Расчетное задание

advertisement
РАСЧЕТНОЕ ЗАДАНИЕ
ОГЛАВЛЕНИЕ
1. Условие .................................................................................................. 2
2. Варианты задания ................................................................................. 2
3. Численные методы вычисления корня уравнения ............................ 4
3.1. Метод Ньютона (метод касательных) ......................................... 4
3.2. Метод проб (метод деления отрезка пополам) ........................... 5
3.3. Метод секущих .............................................................................. 6
3.4. Метод простых итераций .............................................................. 7
3.5. Метод хорд ..................................................................................... 8
4. Пример выполнения расчетного задания ........................................... 8
4.1. Интерфейс проекта ........................................................................ 8
4.2. Формулирование подзадач ........................................................... 9
4.3. Программный код проекта. .......................................................... 9
4.4. Подпрограмма вычисления корня уравнения по методу хорд13
4.5. Подпрограмма pbxГрафик построения графика функции f
(x).................................................................................................................... 15
4.6. Событийная подпрограмма btnВычислить_Click .................... 15
4.7. Подпрограмма Form1_Load ........................................................ 15
4.8. Примеры работы проекта ........................................................... 15
5. Порядок выполнения расчетного задания ....................................... 16
2
1. Условие задания
Для каждого из пяти заданных вариантов допустимой ошибки  заданным численным
методом вычислить приближенное значение корня функционального уравнения вида f (x) = 0,
если известно, что это уравнение имеет единственный корень на отрезке [a, b].
В проекте должно быть предусмотрено:
- построение графика функции f (x) на отрезке [a, b],
- проверка корректности введенных значений исходных данных (выполнение условия a <
b, выполнение условия  > 0),
- обработку исключения, когда строку введенных символов при задании числового
значения невозможно интерпретировать как число,
- запись результатов решения в текстовый файл.
Содержание пояснительной записки
Пояснительная записка должна иметь титульный лист, оглавление, нумерацию страниц,
а также включать:
- условие задачи с учетом заданного варианта задания;
- описание заданного численного метода;
- блок-схему алгоритма подзадачи вычисления корня;
- код подпрограммы вычисления корня;
- полный код программы;
- результаты вычислений значения корня для заданных пяти вариантов допустимой ошибки.
2. Варианты задания
Номер
варианта
1
2
3
4
5
6
7
8
9
10
11
Таблица 1. Варианты
Область,
содержаЛевая часть уравнения f (x)=0
щая единственный
корень
[2;3]
3,83sin x
x
0,35
[0;0,85]
1
x
3  sin3,6 x
[0;1]
3
cos 1  0,3x  x
[0;1]
sin 1  0,4 x 2  x
[2;3]
0,25x3–x –1,2502
расчетного задания
Вариант Вариант
допучисстимой
ленного
ошибки
метода
1
1
2
1
3
1
4
1
1
2
0,1x2– x ln x
3x – 4ln x –5
ex– e–x – 2
[1;2]
2
2
[2;4]
[0;1]
3
4
2
2
x  x  3 x  2,5
tg 3 x tg 5 x 1
tgx 


3
5
3
2
1 1
cos  2 sin 
x
x x
[0,4;1]
1
3
[0;0,8]
2
3
[1;2]
3
3
3
Номер
варианта
12
13
14
15
16
17
18
19
Левая часть уравнения f (x)=0
sin(ln x) – cos(ln x)+2ln x
ln x – x+1,8
0,4  arctg x  x
1
x tg x 
3
tg(0,55x+0,1) – x2
1
x
x
1+sinx – ln(1+x) – x
cos(x0,52+2) + x
2  sin
Область,
содержащая единственный
корень
[1;3]
[2;3]
[1;2]
Окончание табл. 1
Вариант Вариант
допучисстимой
ленного
ошибки
метода
4
1
2
3
4
4
[0,2;1]
3
4
[0;1]
4
4
[1,2;2]
5
1
[0;1,5]
[0,4;1]
6
7
1
1
20
ln1  x  3  x
[2;3]
8
1
21
ex+ln x – 10x
3x – 14+ex– e-x
[3;4]
5
2
[1;3]
6
2
2ln2x+6lnx – 5
2x sin x – cos x
2
x
cos x  e 2  x  1
1  x  tg x
sinx2+cos x2–10x
[1;3]
7
2
[0,4;1]
[1;2]
8
5
2
3
[0;0,9]
6
3
[0;1]
7
3
[-1;0]
8
3
[0;0,9]
5
1  x  cos 1  x
30
[1;2]
6
x
x
tg  ctg  x
2
2
31
x – cos x
[0,5; 2,5]
2
Варианты численного метода:
1) метод простых итераций,
2) метод Ньютона,
3) метод проб,
4) метод секущих,
5) метод хорд.
Варианты допустимой ошибки:
1) 0,05; 0,002; 0,0001; 0,00005; 0,000002;
2) 0,1; 0,01; 0,001; 0,0001; 0,00001;
3) 0,02; 0,0008; 0,00008; 0,00001; 0,000001;
4) 0,08; 0,01; 0,0012; 0,00015; 0,000018;
5) 0,06; 0,005; 0,0004; 0,00003; 0,000002;
6) 0,1; 0,08; 0,007; 0,0006; 0,00005;
7) 0,01; 0,001; 0,0001; 0,00001; 0,000001;
8) 0,02; 0,005; 0,0002; 0,00005; 0,000002.
К оглавлению
4
22
23
24
25
26
27
28
29
e x  1  e 2x  2
4
5
4
3. Численные методы вычисления корня функционального
уравнения
Пусть имеется функциональное уравнение вида: f (x) = 0.
(1)
Корнем этого уравнения является такое, возможно не единственное, значение x = x*, при
котором имеет место тождество f (x*) ≡ 0.
Пусть также известно, что на некотором отрезке [a, b] уравнение (1) имеет единственный
корень. Поставим задачу найти такое приближенное значение корня xw, которое мало
отличается от точного значения корня x*, так что выполняется неравенство │x* – xw │<  , где 
– малая положительная величина – допустимая ошибка, которую мы можем заранее задать по
своему усмотрению.
y
y = f (x)
xs
a
x*
xn
x
b
Рис. 1. Графическая иллюстрация метода Ньютона
3.1. Метод Ньютона (метод касательных)
Рис. 1 поясняет метод Ньютона. Пусть имеется начальное приближение к корню,
которое обозначим xn.
Проведем касательную к графику y = f (x) в точке с координатами (xn, f (xn)). Новое
приближение к корню, которое мы будем называть следующим приближением, xs получим как
точку пересечения этой касательной с осью абсцисс. Это правило приводит к следующей
расчетной формуле:
При соблюдении некоторых условий (они называются условиями сходимости), которые
будут перечислены ниже, строго доказывается, что приближение xs находится ближе к корню,
чем приближение xn .
x x 
s
n
a
f ( xn )
f ' ( xn )
(2)
.
b
Теперь заменим значение начального приближения xn на значение только что
полученного приближения xs . Мы пришли к той же самой задаче, но теперь начальное
приближение расположено ближе к корню, чем до его изменения на xs. Каждое такое
улучшение приближения к корню за счет вычисления следующего приближения называется
итерацией.
Сколько нужно выполнить итераций, чтобы нас могла устроить точность приближение xs
к значению корня x*?
Обычно считают, что требуемая точность достигнута, если после вычисления xs при
выполнении очередной итерации соблюдается условие:
│xs - xn │<  .
(3)
К оглавлению
5
При выполнении неравенства (3) итерационный процесс уточнения корня следует
прекратить и в качестве искомого приближенного значения корня взять
xw = xs .
(4)
При выполнении первой итерации в качестве начального приближения xn можно взять
любую точку отрезка [a, b], например его середину:
xn = (a+b)/2.
(5)
Смысл условий сходимости метода Ньютона состоит в том, что начальное приближение
xn, используемое при выполнении первой итерации, должно быть не слишком далеко от корня,
а производная f ’(x) должна изменяется на отрезке [a, b] не очень быстро и не обращаться в ноль
ни в одной точке отрезка [a, b]. Мы будем считать, что они выполняются.
Метод Ньютона является наиболее быстрым среди численных методов вычисления
корня функционального уравнения. На практике необходимая точность достигается буквально
после выполнения нескольких (как правило, не более 10) итераций.
Формулы (2) – (5) должны быть применены в алгоритме вычисления корня по методу
Ньютона. Для вычисления входящей в формулу (2) производной f ‘ (x) следует найти ее
аналитическое выражение, применить в программе функцию для вычисления значения
производной.
3.2. Метод проб (метод деления отрезка пополам)
Рис. 2 иллюстрирует метод проб. Этот метод в отличие от метода Ньютона использует
не одно, а два начальных приближения, которые мы обозначим соответственно xn1 и xn2. Перед
выполнением первой итерации возьмем
xn1 = a
и
xn2 = b.
(6)
При выполнении каждой очередной итерации следующее приближение по методу проб
получается
как
средняя
точка
отрезка
[xn1 , xn2], что соответствует выражению
xs = ( xn1+ xn2)/2.
(7)
Затем следует определить, с какой стороны от середины отрезка xs находится корень x*.
Для этого достаточно сравнить знаки f (xs) и f (xn2) или знаки f (xs) и f (xn1).
y
y = f(x)
xn1
a
xs
xn2
x*
b
x
Рис. 2. Графическая иллюстрация метода проб
Если же знаки f (xs) и f (xn2) не совпадают, то это означает, что f (x) пересекает ось x на
правом полуотрезке [xs, xn2]. Следовательно, корня нет на левом полуотрезке [xn1, xs], и этот
полуотрезок можно отбросить, то есть можно перенести левую границу xn1 в среднюю точку xs
(заменить значение приближения xn1 на значение xs).
Итак, в результате выполнения итерации отрезок [xn1, xn2] как и прежде, содержит
единственный корень, но его длина стала меньше в два раза.
К оглавлению
6
Совпадение знаков f (xs) и f (xn2) можно проверить, например, проверив неравенство:
f (xs)*f (xn2) > 0,
(8)
или неравенство:
Sign(f (xs)) = Sign(f (xn2)).
(9)
Очевидно, когда неравенство (8) выполняется или когда выражение (9) имеет значение
Ttrue, знаки f (xs) и f (xn2) одинаковы.
Также очевидно, что требования по точности вычисления корня будут выполнены, когда
в результате выполнения итераций половина длины отрезка станет меньше допустимой
ошибки:
│ xn2 - xn1 │/ 2 < .
(10)
Если неравенство (10) выполнено, то в качестве искомого приближенного значения
корня следует взять:
xw = (xn2 + xn1)/2 .
(11)
Расчетные формулы (6) – (11) должны быть применены в алгоритме вычисления корня
по методу проб.
3.3. Метод секущих
Метод секущих, так же, как и метод проб, использует не одно, а два начальных
приближения, которые мы обозначим соответственно xn1 и xn2. Перед выполнением первой
итерации воспользуемся правилом (6) для определения значений этих приближений.
При выполнении каждой очередной итерации для вычисления следующего приближения
по методу хорд проведем прямую линию (секущую) MN через точки с координатами (xn1, f (xn1))
и (xn2, f (xn2)), а абсциссу точки пересечения секущей MN с осью х возьмем в качестве значения
следующего приближения xs к корню (рис. 3).
y
N
a
xn1
a
y = f(x)
xn2
xs
x*
b
x
М
Рис. 3. Графическая иллюстрация метода секущих
Принятое правило нахождения следующего приближения приводит к расчетной
формуле:
f ( x n1 )
x x 
s
n1 f ( x )  f ( x )
n2
n1
.
(12)
x n2  x n1
Из трех приближений к корню оставим два последних (отбрасываем самое старое xn1). В
методе секущих это делается по следующему правилу:
xn1 = xn2; xn2 = xs.
(13)
Выполнение итераций можно прекратить при выполнении условия:
7
│xn2 - xn1│< ,
(14)
Полученное значение приближения xs следует взять в качестве искомого значения корня
xw.
Расчетные формулы (6), (12) – (14) должны быть применены в алгоритме вычисления
корня по методу секущих.
Обратим внимание на то, что формула (12) имеет много общего с формулой Ньютона
(2). Знаменатель в формуле (12) есть не что иное, как среднее значение производной f ‘(x) на
отрезке [xn1, xn2].
3.4. Метод простых итераций
Метод простых итераций предназначен для нахождения корня функционального
уравнения вида:
x =  (x).
(15)
Уравнение вида (1) всегда можно преобразовать к виду (15).
Действительно, умножим левую и правую части уравнения (1) на некоторый
коэффициент с. Полученное уравнение с*f (x) = 0 очевидно имеет те же корни, что и исходное
уравнение (1). Теперь, добавив х к левой и правой части, получим уравнение х+ с*f (x) = х,
корни которого опять те же, что и у исходного уравнения (1). Обозначив х + с*f (x) =  (x), мы
придем к уравнению (15). Коэффициент с следует выбирать так, чтобы во всех точках отрезка
[a, b] соблюдалось неравенство:
│’(x)│< 0,5.
(16)
Следует заметить, что для тех вариантов расчетного задания, в которых предполагается
применение метода простых итераций, в таблице вариантов задана f (x) такого вида, что
переход к уравнению вида (15) элементарен (достаточно разрешить уравнение f (x) = 0
относительно x).
Метод простых итераций подобно методу Ньютона предполагает применение одного
начального приближения. Перед первой итерацией значение начального приближения xn может
быть получено, как и в методе Ньютона, по формуле (5).
Следующее приближение получают по правилу :
xs =  ( xn).
(17)
y
y=x
M
N
a
y =  (x)
xs
x*
xn
b
x
Рис. 4. Графическая иллюстрация метода простых итераций
Рис. 4 иллюстрирует правило (17) для вычисления следующего приближения по методу
простых итераций. На этом рисунке точка М имеет координаты (xn,  ( xn)), точка N –
координаты (xs,  ( xn)).
К оглавлению
8
После вычисления приближения xs заменим значение начального приближения xn на
значение только что полученного приближения xs и выполним следующую итерацию.
Можно доказать, что при выполнении условия (16) метод простых итераций сходится, а
требуемая точность будет достигнута, если после вычисления xs при очередной итерации
соблюдается условие (3).
При выполнении неравенства (3) итерационный процесс уточнения приближенного
значения корня следует прекратить и в качестве искомого приближенного значения корня xw
взять последнее полученное значение xs .
При разработке алгоритма вычисления корня по методу простых итераций следует
использовать формулы (5), (17), (3).
3.5. Метод хорд
Этот метод нахождения корня во многом схож с методом секущих. Следующее
приближение xs вычисляется по той же формуле (12), которая применяется в методе секущих.
Однако после вычисления приближения xs новые значения приближений xn1 и xn2 вычисляются
так же, как и в методе проб. При выполнении итераций по методу хорд может оказаться, что к
корню приближается только левая или только правая граница отрезка [xn1, xn2]. Поэтому в
качестве меры близости к корню здесь следует применить величину перемещения границы при
очередной итерации, которая равна:
xs – xn1, если корень справа от xs,
d=
(18)
xn2 – xs, если корень слева от xs .
Необходимая точность будет достигнута при выполнении неравенства после очередной
итерации:
│d│< .
(19)
4. Пример выполнения расчетного задания
В этом примере разработка проекта выполняется для варианта № 31 из таблицы
вариантов, приведенной ранее в параграфе 2.
4.1. Интерфейс проекта
Внешний вид формы изображен на рис. 5.
На форме Form1 расположено 14 объектов. Ознакомьтесь с их назначением.
Поле изображения pbxГрафик предназначено для отображения графика функции f(x) на
отрезке [a, b]. Из этого графика можно убедиться в единственности корня на заданном отрезке,
а также грубо оценить значение корня.
Текстовые окна txta, txtb и txteps позволяют задать значения исходных данных a,
b, eps.
Надпись lblКорень будет отображать вычисленное приближенное значение корня или
сообщения о том, что решение не получено.
Надпись lblИтерации будет отображать количество выполненных итераций.
Назначение остальных объектов понятно без дополнительных пояснений.
К оглавлению
9
txta
Label1
txtb
txteps
Label2
Label3
Label4
lblРезультаты
lblГрафик
pbxГрафик
lblИтерации
btnВыход
Ыыыход
lblКорень
btnВычислить
Рис. 5. Интерфейс проекта
4.2. Формулирование подзадач
В соответствии с принципами структурного программирования следует выделить в
задаче отдельные подзадачи, каждую из которых затем следует оформить в виде подпрограммы
или функции.
В рассматриваемой задаче можно выделить три подзадачи.
1) Приближенное вычисление корня при заданной допустимой ошибке, которое
оформим как подпрограмму koren (ByVal pred As Integer, ByVal a As Single,
ByVal b As Single, ByVal eps As Single, ByRef xw As Single, ByRef it
As Integer, ByRef flag As Boolean), аргументами которой являются:
pred – предельное количество итераций (защита против зацикливания);
a, b – левая и правая границы отрезка, содержащего единственный корень;
eps – допустимая ошибка вычисления корня уравнения;
xw – полученное приближенное значение корня уравнения;
it – выполненное количество итераций;
flag – сигнал зацикливания, когда обращение к подпрограмме закончилось тем, что
количество итераций превысило допустимую величину pred, и приближенное значение корня
не было получено.
2) Вычисление значения заданной функции f (x). Для этого применим функцию
f(ByVal x As Single) As Single.
3) Построение графика функции f (x) на отрезке [a, b]. Это будет делать
подпрограмма pbxГрафик_Paint.
4.3. Программный код проекта.
К оглавлению
Ниже приведена программа проекта.
Imports System.Math
Imports System.Drawing, System.Drawing.Text
Public Class Form1
Dim a As Single, b As Single, id As Boolean
Dim eps As Single
10
5:
10:
15:
20:
25:
30:
35:
40:
45:
Dim nf As Integer
Private Sub btnВычислить_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnВычислить.Click
Dim xw As Single, it As Integer
Dim Flag As Boolean
lblРезультаты.Visible = False
lblГрафик.Visible = False
lblИтерации.Visible = False
lblКорень.Visible = False
id = False
Try
a = CSng(txtA.Text)
Catch
MsgBox("Введенное значение a не число? Поправьте!")
Exit Sub
End Try
Try
b = CSng(txtB.Text)
Catch
MsgBox("Введенное значение b не число? Поправьте!")
Exit Sub
End Try
Try
eps = CSng(txtEps.Text)
Catch
MsgBox("Введенное значение eps не число? Поправьте!")
Exit Sub
End Try
' Проверка корректности данных
If a >= b Then
MsgBox("Нарушено условие a < b? Поправьте!")
Exit Sub
End If
If eps <= 0 Then
MsgBox("Допустимая ошибка eps <= 0? Поправьте!")
Exit Sub
End If
id = True
' Вычисление корня
koren(100, a, b, eps, xw, it, Flag)
' Вывод результатов вычислений
If Flag Then
lblКорень.ForeColor = Color.Red
lblКорень.Text = _
"Решение не получено!"
lblКорень.Visible = True
'Запись в файл
PrintLine(nf, "Решение не получено!")
Exit Sub
Else
lblИтерации.Text = "Решение получено! Выполнено " & _
it.ToString & " итераций"
lblКорень.ForeColor = Color.Black
11
50:
55:
5:
10:
15:
20:
25:
lblКорень.Text = "Значение корня = " & _
Format(xw, "0.#######")
lblКорень.Visible = True
lblИтерации.Visible = True
lblГрафик.Visible = True
'Запись в файл
PrintLine(nf, a, b, eps, it, xw)
End If
pbxГрафик.Invalidate()
End Sub
Private Sub btnВыход_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnВыход.Click
FileClose(nf)
End
End Sub
Private Function f(ByVal x As Single) As Single
f = x - Cos(x)
End Function
Private Sub koren(ByVal pred As Integer, _
ByVal a As Single, ByVal b As Single, ByVal eps As Single, _
ByRef xw As Single, ByRef it As Integer, ByRef Flag As Boolean)
Dim xn1 As Single, xn2 As Single, _
xs As Single
Dim fxn1 As Single, fxn2 As Single, _
fxs As Single
Dim d As Single, Bool As Boolean
xn1 = a
xn2 = b
it = 0
fxn1 = f(xn1)
fxn2 = f(xn2)
Do
xs = xn1 - fxn1 / ((fxn2 - fxn1) / _
(xn2 - xn1))
fxs = f(xs)
it = it + 1
Bool = (Sign(fxs) = Sign(fxn2))
If Bool Then
d = xn2 - xs
xn2 = xs
fxn2 = fxs
Else
d = xs - xn1
xn1 = xs
fxn1 = fxs
End If
Bool = Abs(d) < eps Or it > pred
Loop Until Bool
If it <= pred Then
Flag = False
xw = xs
Else
Flag = True
12
30:
5:
10:
15:
20:
25:
30:
35:
40:
45:
End If
End Sub
Private Sub pbxГрафик_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles pbxГрафик.Paint
Dim x, ab, dx As Single
Dim i, n As Integer
n = 10
ab = b - a
dx = ab / n
If id Then
Dim mx As Single
Dim sx, sy, h, w As Integer
h = pbxГрафик.Height
w = pbxГрафик.Width
mx = 0.9 * w / ab
sx = w * (0.05 - 0.9 * a / ab)
sy = h / 2
Dim G As Graphics
G = e.Graphics
G.TranslateTransform(sx, sy)
G.ScaleTransform(mx, mx)
Dim P1, P2 As Pen
P1 = New Pen(Color.Black, 1 / mx)
P2 = New Pen(Color.Red, 1 / mx)
Dim x1, x2, y1, y2 As Single
x1 = a - 0.02 * ab
y1 = 0
x2 = b + 0.02 * ab
y2 = 0
G.DrawLine(P1, x1, y1, x2, y2)
x1 = 0
y1 = -h / 2 + 0.01 * mx
x2 = 0
y2 = h / 2 - 0.01 * mx
G.DrawLine(P1, x1, y1, x2, y2)
x1 = a
y1 = f(x1)
x2 = x1 + dx
y2 = f(x2)
For i = 1 To n
G.DrawLine(P2, x1, y1, x2, y2)
x1 = x2
y1 = y2
x2 = x2 + dx
y2 = f(x2)
Next
Dim ШагШкалы As Single
If CInt(ab) > 0 Then ШагШкалы = CInt(ab) / 10 _
Else ШагШкалы = 0.05
For x = CInt(a * 10) / 10 To b + ШагШкалы / 2 _
Step ШагШкалы
G.DrawLine(P1, x, -CSng(ab / 100), x, _
13
CSng(ab / 100))
Dim fnt As New Font("Times New Roman", _
7 / mx, FontStyle.Regular)
Dim Br As New SolidBrush(Color.Black)
G.DrawString(Format(x, "0.00"), fnt, Br, _
x, ab / 100)
50:
Next
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
nf = FreeFile()
FileOpen(nf, "d:\РабочаяПапка\frz.txt", OpenMode.Output)
PrintLine(nf, "a", "b", "Доп. ошибка", _
"Вып. итераций", "Знач. корня")
FileClose(nf)
nf = FreeFile()
FileOpen(nf, "d:\РабочаяПапка\frz.txt", OpenMode.Append)
End Sub
End Class
На первый взгляд программа представляется сложной. Однако ее понимание упрощается
благодаря тому, что она состоит из отдельных блоков (процедур). И только два из этих блоков
зависят от конкретного варианта. К ним относятся функция, вычисляющая значение f (x),
которая настолько проста, что не требует пояснений, а также подпрограмма вычисления корня.
С нее и начнем пояснение программы.
К оглавлению
4.4. Подпрограмма вычисления корня уравнения по методу хорд
При разработке алгоритма использованы расчетные формулы (6), (9), (11), (12) и (18).
Блок-схема алгоритма вычисления корня по методу хорд приведена на рис. 6.
Описание данных
Входные аргументы
pred – переменная целого типа (предельное количество итераций);
a, b – переменные с плавающей точкой (левая и соответственно правая граница
заданного отрезка, на котором содержится единственный корень заданного уравнения);
eps – переменная с плавающей точкой (допустимая ошибка).
В ы х о д н ы е а р г у м е н т ы.
xw – переменная с плавающей точкой (приближенное значение корня);
it – переменная целого типа (количество выполненных итераций);
flag – переменная логического типа (признак зацикливания).
Локальные данные
xn1, xn2- переменные с плавающей точкой (начальные приближения к корню);
xs - переменная с плавающей точкой (следующее приближение к корню);
fxn1, fxn2 и fxs - переменные с плавающей точкой (значения f(xn1), f(xn2) и f(xs)
соответственно);
14
Вход
xn1 = a
xn2 = b
it = 0
fxn1 = f(xn1)
fxn2 = f(xn2)
f ( xn1)
f ( xn2)  f ( xn1)
xn2  xn1
fxs = f(xs)
it = it + 1
xs  xn1 
bool = Sign(fxs) = Sign(fxn2)
Нет
Да
bool
d = xs – xn1
xn1 = xs
fxn1 = fxs
d = xn2-xs
xn2 = xs
fxn2 = fxs
bool = ( │d│< eps) or ( it > pred)
Нет
Да
bool
Да
Нет
it ≤ pred
flag = True
flag = False
xw = xs
Выход
Рис. 6. Блок-схема алгоритма вычисления корня по методу хорд
d - переменная вещественного типа (величина изменения начального приближения при
выполнении очередной итерации);
bool - переменная логического типа (рабочая переменная).
В строках 1 – 3 тела подпрограммы koren объявляются локальные данные. Строки 4 – 8
выполняют подготовку к центральной циклической части алгоритма выполнения итераций, к
которой относятся строки 9 – 24. В строках 25 – 30 анализируется, чем закончилось выполнение
15
подпрограммы, получением с заданной точностью приближенного значения корня или же
произошло зацикливание.
К оглавлению
4.5. Подпрограмма pbxГрафик построения графика функции f (x).
В третьей строке тела подпрограммы переменная n (число равных частей, на которые
делится отрезок ab) задается равной 10.
Построение графика (строки 7 – 50) выполняется, если успешно были заданы исходные
данные a, b, eps, а также успешно закончилась проверка их корректности (только в этом
случае переменная id получает значение True). Это условие проверяется в строке 6.
В строках 7 – 13 выполняется вычисление масштаба mx по оси x, а также смещения sx
по этой же оси. Масштаб по оси y принят равным масштабу по оси x. При этом условии не
происходит искажения символов текста оцифровки оси x.
Строки 14 и 15 создают поверхность рисования на поле изображения pbxГрафик.
В строках 16 и 17 выполняется преобразование системы координат за счет применения
смещения по осям x и y, а также за счет введения масштаба mx по этим осям.
В строках 18 – 20 создаются два пера: черное – для рисования осей и красное – для
рисования графика функции.
Строки 22 – 26 рисуют ось x.
Ось y рисуют инструкции 27 – 31.
Рисование графика функции обеспечивают инструкции 32 – 42.
Строки 43 – 50 выполняют оцифровку оси x.
4.6. Событийная подпрограмма btnВычислить_Click
В теле этой событийной подпрограммы в строках 1 и 2 объявлены локальные данные:
xw – переменная с плавающей точкой одинарной точности (искомое приближенное
значение корня).
it – переменная целого типа (количество выполненных итераций).
Flag – переменная логического типа (сигнал зацикливания).
Строки 3 – 6 делают невидимыми соответствующие объекты формы.
Инструкции 7 – 35 выполняют ввод значений исходных данных a, b, eps, а также
проверку их корректности.
В строке 37 выполняется обращение к подпрограмме koren для вычисления
приближенного значения корня.
Инструкции 39 – 55 обеспечивают отображение результатов, полученных при
вычислении корня, а также их запись в текстовый файл последовательного доступа.
Строка 56 выполняет инициирование перерисовывания графика функции.
4.7. Подпрограмма Form1_Load
Эта подпрограмма выполняется при загрузке формы. В этой подпрограмме открывается
файл последовательного доступа для записи в файл frz.txt. Если этого файла нет, то он
создается. Если же он есть, то он очищается. Затем этот файл закрывается и открывается вновь
для добавлений.
4.8. Примеры работы проекта
На рис. 7 приведен пример результата работы проекта, когда при заданных значениях
исходных данных решение получено.
На рис. 8 приведен пример результата работы проекта, когда обнаружена
некорректность в заданных значениях исходных данных.
16
В табл. 2 приведены результаты вычислений, выполненных для варианта № 31
расчетного задания.
Рис. 7. Пример нормального завершения
вычисления значения корня
Рис. 8. Пример аварийного завершения
работы, когда исходные данные
некорректны
Таблица 2. Результаты выполнения расчета
a
0
0
0
0
0
b
1
1
1
1
1
Доп. ошибка
0,1
0,01
0,001
0,0001
1E-05
Вып. итераций Знач. Корня
2
0,736299
3
0,7389454
4
0,7390781
5
0,7390848
5
0,7390848
К оглавлению
5. Порядок выполнения расчетного задания
1.
2.
3.
Создайте на диске d рабочую папку, в которой будут храниться Ваши файлы (но только во
время сеанса Вашей работы на компьютере). Перед окончанием сеанса работы рабочую
папку рекомендуется сохранить и после этого ее на жестком диске удалить, чтобы не
загружать последний лишней информацией.
Создайте новый проект и сохраните его в своей рабочей папке.
Поместите на форме объекты и задайте значения их свойств такими, чтобы интерфейс
соответствовал рис. 5.
17
Если Вы имеете доступ к электронной копии этого пособия, то копируйте код программы из
раздела 4.3 и вставьте эту копию в свой проект вместо кода, созданного системой. Иначе
весь код проекта придется ввести вручную.
5. Ознакомьтесь с работой проекта. Если при его работе возникают ошибки, то проверьте
правильность задания Вами имен объектов и формы. Найдите и устраните ошибки.
6. Замените вид функции на заданный в Вашем варианте. Если Вам задано применять
численный метод Ньютона, то добавьте в программу еще одну функцию, вычисляющую
значение производной функции f (x). Если же Вам задано применять численный метод
простых итераций, то добавьте в программу еще одну функцию, вычисляющую значение
функции  (x).
7. Разработайте процедуру для вычисления значения корня заданным в Вашем варианте
численным методом. Замените код процедуры koren разработанным Вами кодом.
8. Выполните прогоны приложения. Устраните обнаруженные ошибки.
9. Получите решение для пяти значений допустимой ошибки. Запишите их. Проанализируйте
полученные результаты с точки зрения достоверности. Если они Вас удовлетворяют, то
покажите их преподавателю.
10. С помощью текстового процессора MS Word 2007 подготовьте пояснительную записку
по расчетному заданию, правила оформления и содержание которой оговорены в условии
расчетного задания. При этом для сокращения работы по набору текста и созданию
рисунков рекомендуется воспользоваться копированием фрагментов настоящего пособия,
электронная
копия
которого
содержится
в
папке
k:\Fp\Inf.NET\2
семестр\Задания.
11. Результаты вычислений вставьте в пояснительную записку из текстового файла
последовательного доступа, записанного в процессе выполнения проекта.
К оглавлению
4.
Download