Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пример курсовой работы по вычислительным методам.docx
Скачиваний:
14
Добавлен:
11.03.2016
Размер:
1.45 Mб
Скачать
  1. Тестирование процедур, реализующих данные методы

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

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

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

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

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

  1. Находим точкуминимума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

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

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

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

Получим значениеинтегралас использованием средств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

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

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

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

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, так как функция, заданная таблично,квадратичная.