Реализация решения поставленной задачи с помощью среды программирования Visual Basic 6.0

 

Поставленная в курсовой работе задача по аппроксимации функции, заданной таблично, была выполнена с помощью визуальной среды программирования Visual Basic 6.0

Сначала в приложении «Блокнот» был создан .txt файл, содержащий исходные данные. Его можно увидеть на рис. 7.

 

Рис.7

 

Текстовый файл находится в одном каталоге с проектом Visual Basic.

Далее с помощью стандартных блоков была составлена форма для визуализации программы аппроксимации функции, заданной таблично. После этого был введен код программы, представленный ниже.

 

Код программы:

' Описание переменных для процедуры решения СЛАУ

Dim A()

Dim B()

Dim v()

Dim i As Integer

Dim N As Integer

Dim N1 As Integer

' Описание массива X и Y

Dim x(30) As Single

Dim y(30) As Single

 

' Описание переменных для построения графиков

Dim SngX As Single

bytI As Integer

yy As Single

' SngX - абсцисса точки, y – ордината

 

' Описание переменных для рассчетных формул

Dim SumX, SumY As Single

Dim Sumx2, SumXY As Single

Dim Sumx3 As Single

Dim Sumx4 As Single

Dim SumX2y As Single

Dim SumLnY As Single

Dim SumXLnY As Single

Dim Xsr As Single

Dim Ysr As Single

Dim SumX_Xsr As Single

Dim SumY_Ysr As Single

Dim Pr_Sum_sr As Single

Dim X_Xsr_2 As Single

Dim Y_Ysr_2 As Single

Dim Sum_ost_lin As Single

Dim Sum_ost_kvad As Single

Dim Sum_ost_exp As Single

Dim koeff_kor As Single

Dim koeff_det_lin As Single

Dim koeff_det_kvad As Single

Dim koeff_det_exp As Single

 

' Описание переменных и констант для ввода ИД из файла

Dim masXY() As String

Dim inCounter As Integer

Dim inFoundPos As Integer

Dim num As Byte

Const PROBEL = " "

 

Sub Draw()

 

' Построение графика функции

 

' Задание масштаба и новой системы координат

Picture1.Scale (x(0) - 1, y(N) + 20)-(x(N) + 1, y(0) - 20)

For SngX = x(0) - 1 To x(N) + 1 Step 0.005

yy = v(1) + v(2) * SngX ' Вычисление ординаты y

Picture1.PSet (SngX, yy), vbWhite ' Рисуем точку

Next SngX ' Берем следующую абсциссу

 

' Рисуем ось X

Picture1.Line (x(0) - 1, 0)-(x(N) + 1, 0)

For bytI = x(0) - 1 To x(N) + 1

Picture1.PSet (bytI, 0) ' Рисуем масштаб на оси X

Picture1.Print bytI ' Подписываем масштаб

Next bytI

 

' Рисуем ось Y

Picture1.Line (0, y(N) + 20)-(0, y(0) - 20)

For bytI = y(0) - 20 To y(N) + 20 Step 20

Picture1.PSet (0, bytI) ' Рисуем масштаб на оси Y

Picture1.Print bytI ' Подписываем масштаб

Next bytI

 

' Построение точечного графика функции ИД

For i = 1 To N

Picture1.Circle (x(i), y(i)), 0.05, vbBlue

Next i

End Sub

 

Private Sub Gauss(A(), v(), N As Integer, Epsilon)

 

' Процедура решения СЛАУ методом Гаусса

Dim Result As Boolean

Dim R(10, 10) As Double

Dim k As Long

Dim u As Long

Dim m As Long

Dim j As Long

Dim i As Long

Dim t As Double

 

For i = 1 To N

For j = 1 To N + 1

R(i, j) = A(i, j)

Next

Next

 

u = 0

Result = True

Do

u = u + 1

k = u

Do While Abs(R(k, u)) <= Epsilon And k < N

k = k + 1

Loop

If k <> N Or Abs(R(N, u)) > Epsilon Then

If k <> u Then

m = u

Do

t = R(u, m)

R(u, m) = R(k, m)

R(k, m) = t

m = m + 1

Loop Until Not m <= N + 1

End If

j = N + 1

Do

R(u, j) = R(u, j) / R(u, u)

j = j - 1

Loop Until Not j >= u

m = N + 1

If k + 1 <= N Then

i = k + 1

Do

j = u + 1

Do

R(i, j) = R(i, j) - R(i, u) * R(u, j)

j = j + 1

Loop Until Not j <= m

i = i + 1

Loop Until Not i <= N

End If

Else

Result = False

End If

Loop Until Not (u <> N And Result)

If Result Then

i = N

Do

v(i) = R(i, m)

If i <> 1 Then

k = i - 1

Do

R(k, m) = R(k, m) - R(k, i) * v(i)

k = k - 1

Loop Until Not k >= 1

End If

i = i - 1

Loop Until Not i >= 1

End If

 

End Sub

 

Private Sub Command1_Click()

 

' Считывание исходных данных из текстового файла

num = FreeFile

Open "ID1.txt" For Input As #num

While Not EOF(num)

i = i + 1

ReDim Preserve masXY(i)

Line Input #num, masXY(i)

Wend

Close num

 

' Заполнение значений массивов X и Y и отображение в ListBox

N = i

For i = 1 To N Step 1

inCounter = 1

inFoundPos = InStr(inCounter, masXY(i), PROBEL)

While inFoundPos <> 0

x(i) = Val(Mid$(masXY(i), inCounter, inFoundPos - inCounter))

inCounter = inFoundPos + 1

inFoundPos = InStr(inCounter, masXY(i), PROBEL)

Wend

If inCounter < Len(masXY(i)) Then

y(i) = Val(Mid$(masXY(i), inCounter))

End If

List1.AddItem x(i)

List2.AddItem y(i)

Next i

 

' Расчет необходимых величин по формулам

For i = 1 To N Step 1

SumX = SumX + x(i)

SumY = SumY + y(i)

Sumx2 = Sumx2 + x(i) ^ 2

SumXY = SumXY + x(i) * y(i)

Sumx3 = Sumx3 + x(i) ^ 3

Sumx4 = Sumx4 + x(i) ^ 4

SumX2y = SumX2y + x(i) ^ 2 * y(i)

SumLnY = SumLnY + Log(y(i))

SumXLnY = SumXLnY + x(i) * Log(y(i))

Next i

 

Xsr = SumX / N

Ysr = SumY / N

 

For i = 1 To N Step 1

SumX_Xsr = SumX_Xsr + (x(i) - Xsr)

SumY_Ysr = Sumy_Xsr + (y(i) - Ysr)

Pr_Sum_sr = Pr_Sum_sr + SumX_Xsr * SumY_Ysr

X_Xsr_2 = X_Xsr_2 + (x(i) - Xsr) ^ 2

Y_Ysr_2 = Y_Ysr_2 + (y(i) - Ysr) ^ 2

Next i

 

' Линейная аппроксимация

N1 = 2

ReDim A(1 To N, 1 To N + 1)

ReDim B(1 To N)

ReDim v(1 To N)

A(1, 1) = N

A(1, 2) = SumX

A(2, 1) = SumX

A(2, 2) = Sumx2

A(1, 3) = SumY

A(2, 3) = SumXY

 

Gauss A(), v(), N1, 0.01

 

Text1.Text = "y = " & Round(v(1), 4) & " + " & Round(v(2), 4) & "x"

 

For i = 1 To N

Sum_ost_lin = Sum_ost_lin + (v(1) + v(2) * x(i) - y(i)) ^ 2

Next i

 

koeff_kor = Round(Pr_Sum_sr / Sqr(X_Xsr_2 * Y_Ysr_2), 4)

Text4.Text = koeff_kor

 

koeff_det_lin = Round(1 - Sum_ost_lin / Y_Ysr_2, 4)

Text5.Text = koeff_det_lin

 

Draw

' Построение графика функции

For SngX = x(0) - 1 To x(N) + 1 Step 0.005

yy = v(1) + v(2) * SngX ' Вычисление ординаты y

Picture1.PSet (SngX, yy), vbRed ' Рисуем точку

Next SngX ' Берем следующую абсциссу

 

' Квадратичная аппроксимация

N1 = 3

ReDim A(1 To N, 1 To N + 1)

ReDim B(1 To N)

ReDim B(1 To N)

ReDim v(1 To N)

A(1, 1) = N

A(1, 2) = SumX

A(1, 3) = Sumx2

A(2, 1) = SumX

A(2, 2) = Sumx2

A(2, 3) = Sumx3

A(3, 1) = Sumx2

A(3, 2) = Sumx3

A(3, 3) = Sumx4

A(1, 4) = SumY

A(2, 4) = SumXY

A(3, 4) = SumX2y

 

Gauss A(), v(), N1, 0.01

 

Text2.Text = "y = " & Round(v(1), 4) & " + " & Round(v(2), 4) & "x" & " + " & Round(v(3), 4) & "x^2"

 

For i = 1 To N

Sum_ost_kvad = Sum_ost_kvad + (v(1) + v(2) * x(i) + v(3) * x(i) ^ 2 - y(i)) ^ 2

Next i

 

koeff_det_kvad = Round(1 - Sum_ost_kvad / Y_Ysr_2, 4)

Text6.Text = koeff_det_kvad

 

Draw

' Построение графика функции

For SngX = x(0) - 1 To x(N) + 1 Step 0.005

yy = v(1) + v(2) * SngX + v(3) * SngX ^ 2 ' Вычисление ординаты y

Picture1.PSet (SngX, yy), vbGreen ' Рисуем точку

Next SngX ' Берем следующую абсциссу

 

' Экспоненциальная аппроксимация

N1 = 2

ReDim A(1 To N, 1 To N + 1)

ReDim B(1 To N)

ReDim B(1 To N)

ReDim v(1 To N)

A(1, 1) = N

A(1, 2) = SumX

A(2, 1) = SumX

A(2, 2) = Sumx2

A(1, 3) = SumLnY

A(2, 3) = SumXLnY

 

Gauss A(), v(), N1, 0.01

 

Text3.Text = "y = " & Exp(Round(v(1), 4)) & " * " & "exp(" & Round(v(2), 4) & "x)"

 

For i = 1 To N

Sum_ost_exp = Sum_ost_exp + (Exp(v(1)) * Exp(v(2) * x(i)) - y(i)) ^ 2

Next i

 

koeff_det_exp = Round(1 - Sum_ost_exp / Y_Ysr_2, 4)

Text7.Text = koeff_det_exp

 

Draw

' Построение графика функции

For SngX = x(0) - 1 To x(N) + 1 Step 0.005

yy = Exp(v(1)) * Exp(v(2) * SngX) ' Вычисление ординаты y

Picture1.PSet (SngX, yy), vbMagenta ' Рисуем точку

Next SngX ' Берем следующую абсциссу

 

End Sub

 

Private Sub Form_Load()

Frame1.Caption = "Исходные данные"

Frame2.Caption = "Линейная аппроксимация"

Frame3.Caption = "Квадратичная аппроксимация"

Frame4.Caption = "Экспоненциальная аппроксимация"

Frame5.Caption = "Графики зависимостей"

Text1.Text = ""

Text2.Text = ""

Text3.Text = ""

Text4.Text = ""

Text5.Text = ""

Text6.Text = ""

Text7.Text = ""

 

List1.AddItem " X "

List2.AddItem " Y "

Label1.Caption = "КУРСОВАЯ РАБОТА"

Label1.Font.Size = 16

Label1.Alignment = 2

Label2.Caption = "Реализация численного метода с помощью среды программирования Visual Basic 6.0"

Label2.Font.Size = 12

Label2.Alignment = 2

Label3.Caption = "группа СТ-11 студент Максимова Е.Н."

Label3.Font.Size = 12

Label3.Alignment = 2

Label4.Caption = "Коэффициент корреляции"

Label5.Caption = "Коэффициент детерминированности"

Label6.Caption = "Коэффициент детерминированности"

Label7.Caption = "Коэффициент детерминированности"

Command1.Caption = "АППРОКСИМИРОВАТЬ"

End Sub

После нажатия клавиши «АППРОКСИМИРОВАТЬ» форма приняла вид, представленный на рис. 8.

 

Рис. 8

Заключение

 

В ходе написания курсовой работы была проведена аппроксимация функции заданной таблично с помощью метода наименьших квадратов. Это было сделано с помощью средств табличного процессора Microsoft Excel и визуальной среды программирования Visual Basic 6.0.

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

При сравнении точности результатов, полученных в табличном процессоре Microsoft Excel и в среде программирования Visual Basic 6.0, был сделан вывод о том, что табличный процессор более подходит для решения задач такого рода. Это объясняется тем, что программа Visual Basic 6.0 в отличие от Microsoft Excel проводит вычисления косвенными методами, что сильно влияет на точность получаемых результатов.

Библиографический список

 

1. Б.П. Демидович, И.А. Марон. Основы вычислительной математики. М.: Государственное издательство физико-математической литературы, 1963.

2. Информатика: Учебник / Под ред. проф. Н.В. Макаровой. М.: Финансы и статистика, 1997.

3. Информатика: Практикум по технологии работы на компьютере/ Под ред. проф. Н.В. Макаровой. М.: Финансы и статистика, 1997.

4. Н. Николь, Р.Альбрехт. Excel 5.0. Электронные таблицы. М.: Изд. “ЭКОМ”, 1996.