Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Тестирование процедур, реализующих данные методы
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 = 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, так как функция, заданная таблично, квадратичная.
|