- •1. Индивидуальное задание
- •2. Постановка задачи
- •3. Выбор и обоснование используемых методов
- •Тестирование процедур, реализующих данные методы
- •Детализированная схема алгоритма решения задачи в целом
- •Код программы
- •Результаты выполнения программы
- •8. Проверка решения задачи с использованиемMathCad
- •9. Основные выводы и результаты
- •Список литературы:
- •Оглавление
Тестирование процедур, реализующих данные методы
Тестирование процедуры золотого сечения
Для проверки правильностипроцедуры, реализующей методзолотого сечения, в качестве теста используем функцию, имеющая на отрезке [-0.5; 0.5]единственныйминимум, а значение функции в этой точке.
Проведем проверку правильности тестовых данных с использованием средств пакета MathCad:
Задаем функциюf(x):
Графикфункции на отрезке[-0.5; 0.5]:
Находим точкуминимума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
Данные теста совпалисрезультатамивыполненияс точностью
Тестирование процедуры метода Симпсона
В качестве теста для проверки процедуры, реализующей метод Симпсона, используеминтеграл:
Получим значениеинтегралас использованием средств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
Данные теста совпалис результатами выполнения с точностью
Тестирование процедуры формулы Лагранжа
В качестве теста для проверки процедуры, реализующей метод Лагранжадляинтерполированияфункции, воспользуемсятаблицейзначенийфункциина отрезке. Тогда наша функция будет заданатаблично:
x |
f(x) |
0 |
0 |
1 |
2 |
2 |
6 |
3 |
12 |
Получим значение интерполирующей функции в точке 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, так как функция, заданная таблично,квадратичная.