Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Тестирование процедур, реализующих данные методы






4.1 Тестирование процедуры золотого сечения

Для проверки правильности процедуры, реализующей метод золотого сечения, в качестве теста используем функцию , имеющая на отрезке [-0.5; 0.5] единственный минимум , а значение функции в этой точке .

Проведем проверку правильности тестовых данных с использованием средств пакета MathCad:

1) Задаем функцию f(x):

2) График функции на отрезке [-0.5; 0.5]:

3) Находим точку минимума xmin и значение функции в ней:

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

Листинг:

Option Strict On

Imports System.Math

Public Class Form1

Function vvod(ByVal T As TextBox) As Single 'Ввод из ТекстБокса числа типа Single

Return CSng(T.Text)

End Function

Sub vivod(ByVal z As Single, ByRef T As TextBox) 'Вывод в ТекстБокс числа типа Single

T.Text = CStr(z)

End Sub

Function F(ByVal x As Single) As Single 'Искомая функция, на которой требуется найти минимум

F = CSng(x ^ 2 + 2)

End Function

Sub vivodresult(ByVal n As Integer, ByVal a As Single, ByVal b As Single, ByVal x1 As Single, ByVal x2 As Single, ByVal F1 As Single, ByVal F2 As Single, ByVal z As Single)

ListBox1.Items.Add(n)

ListBox2.Items.Add(a)

ListBox3.Items.Add(b)

ListBox4.Items.Add(x1)

ListBox5.Items.Add(x2)

ListBox6.Items.Add(F1)

ListBox7.Items.Add(F2)

ListBox8.Items.Add(z)

End Sub

Sub ZolSech(ByVal a As Single, ByVal b As Single, ByVal Eps As Single, ByRef xt As Single, ByRef ft As Single)

Dim k1, k2, x1, x2, F1, F2 As Single 'k1, k2 - коэффициенты золотого сечения, x1, x2, F1, F2 - абсциссы и значения функции в них соответственно

Dim n As Integer 'Счетчик итераций

k1 = CSng((3 - Sqrt(5)) / 2): k2 = CSng((Sqrt(5) - 1) / 2)

x1 = a + k1 * (b - a): x2 = a + k2 * (b - a) 'Находим начальные приближения к минимуму

F1 = F(x1): F2 = F(x2) 'Находим значения функции в этих точках

Do Until b - a < Eps 'Выполняем цикл, пока не будет достигнута необходимая нам точность

n = n + 1

If F1 < F2 Then

b = x2: x2 = x1

x1 = a + k1 * (b - a)

F2 = F1: F1 = F(x1)

Else

a = x1: x1 = x2

x2 = a + k2 * (b - a)

F1 = F2: F2 = F(x2)

End If

vivodresult(n, a, b, x2, x2, F1, F2, b - a)

Loop

xt = (a + b) / 2 'Окончательный результат поиска минимума

ft = F(xt) 'Окончательное значение функции в точке минимума

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim a, b, Eps, xt, ft As Single

a = vvod(TextBox1)

b = vvod(TextBox4)

Eps = vvod(TextBox5)

ZolSech(a, b, Eps, xt, ft)

vivod(xt, TextBox2)

vivod(ft, TextBox3)

End Sub

End Class

Данные теста совпали с результатами выполнения с точностью

 

4.2 Тестирование процедуры метода Симпсона

В качестве теста для проверки процедуры, реализующей метод Симпсона, используем интеграл:

Получим значение интеграла с использованием средств Mathcad:

Ниже приведены схема тестируемой процедуры, код программы и результаты её выполнения:

 

 

Листинг:

Option Explicit On

Option Strict On

Imports System.Math

Public Class Form1

Function vvod(ByVal T As TextBox) As Single

Return CSng(T.Text)

End Function

Function f(ByVal x As Single) As Single 'Тестируемая функция

f = CSng(14 * x ^ 2 * Cos(x ^ 3))

End Function

Sub Runge(ByVal a As Single, ByVal b As Single, ByVal Eps As Single, ByRef S As Single) 'Процедура, реализующая точность метода по правилу Рунге

Dim h, S1 As Single

Dim n As Integer

n = 2

h = (b - a) / n

S = Simp(a, b, n, h)

ListBox1.Items.Add(n) 'Вывод промежуточных результатов

ListBox2.Items.Add(Mid(CStr(h), 1, 7))

ListBox3.Items.Add(Mid(CStr(S), 1, 7))

Do

n = 2 * n: h = h / 2

S1 = S

S = Simp(a, b, n, h)

ListBox1.Items.Add(n)

ListBox2.Items.Add(Mid(CStr(h), 1, 7))

ListBox3.Items.Add(Mid(CStr(S), 1, 7))

Loop Until Abs(S - S1) / 15 < Eps 'Выполняем дробление шага до тех пор, пока не будет достигнута необходимая точность

End Sub

Function Simp(ByVal a As Single, ByVal b As Single, ByVal n As Integer, ByVal h As Single) As Single 'Функция, реализующая нахождение определенного интеграла методом Симпсона

Dim c, S As Single

S = f(a) + f(b)

c = 4

For i = 1 To n - 1

S = S + c * f(a + i * h)

c = 6 - c

Next

Return S * h / 3

End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim a, b, Eps, S As Single

a = vvod(TextBox1)

b = vvod(TextBox2)

Eps = vvod(TextBox3)

Runge(a, b, Eps, S)

TextBox4.Text = CStr(Mid(CStr(S), 1, 7))

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Me.Close()

End Sub

End Class

 

 

 

Данные теста совпали с результатами выполнения с точностью

 

4.3 Тестирование процедуры формулы Лагранжа

В качестве теста для проверки процедуры, реализующей метод Лагранжа для интерполирования функции, воспользуемся таблицей значений функции на отрезке . Тогда наша функция будет задана таблично:

 

x f(x)
   
   
   
   

 

 

Получим значение интерполирующей функции в точке x = 2.5 средствами математического пакета Mathcad.

 

Ниже приведены схема алгоритма тестируемой процедуры, код программы и результат её выполнения:

 

Листинг:

Option Strict On

Imports System.Math

Public Class Form1

Sub vivod(ByVal z As Single, ByRef T As TextBox)

T.Text = CStr(z)

End Sub

Sub uzlynumer(ByVal t As Single, ByRef x() As Single, ByRef y() As Single) 'Сортировка узлов методом пузырьков, от ближнего к t узла до дальнего

Dim tmp As Single 'Переменная, необходимая для обмена элементов местами

For i = 0 To UBound(x) - 1

For j = i + 1 To UBound(x)

If Abs(x(i) - t) > Abs(x(j) - t) Then

tmp = x(j)

x(j) = x(i)

x(i) = tmp

tmp = y(j)

y(j) = y(i)

y(i) = tmp

End If

Next

Next

End Sub

Function LX(ByVal k As Integer, ByVal x() As Single, ByVal y() As Single, ByVal t As Single) As Single 'Вычисление многочлена Лагранжа k-ого порядка в точке xl

Dim L, l1 As Single

L = 0

For i = 0 To k

l1 = 1

For j = 0 To k

If i < > j Then

l1 = (t - x(j)) / (x(i) - x(j)) * l1 'Вычисление множителей

End If

Next

L = L + l1 * y(i) 'Вычисление слагаемых

Next

LX = L 'Значение полинома в точке xl

End Function

Sub Lagranzh(ByVal t As Single, ByVal x() As Single, ByVal y() As Single, ByVal Eps As Single, ByRef interp As Single) 'Алгоритм интерполяции

Dim k As Integer = 0

Dim L(UBound(x)), tmp, E1 As Single

L(k) = LX(k, x, y, t) 'Вызов функции, которая вычисляет полином Лагранжа и присваивание результата элементу массива L(k)

Do

tmp = L(k)

k = k + 1

interp = LX(k, x, y, t)

ListBox1.Items.Add(k)

ListBox2.Items.Add(interp)

L(k) = interp

E1 = Abs(L(k) - tmp) 'Оценка точности вычисления

Loop Until E1 < Eps Or k = 3

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim interp As Single

Dim xl As Single = CSng(TextBox9.Text)

Dim x() As Single = {0, 1, 2, 3} 'x() и y() - массивы со значениями узлов

Dim y() As Single = {0, 2, 6, 12}

vvodmas(x, y)

uzlynumer(xl, x, y)

Lagranzh(xl, x, y, 0.01, interp)

vivod(interp, TextBox11)

End Sub

End Class

 

 

Скриншот программы:

 

Данные теста полностью совпали с результатами выполнения на MathCAD, так как функция, заданная таблично, квадратичная.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.