![](/user_photo/70644__xXXN.png)
- •Постановка задачи
- •Выбор и обоснование используемых методов Метод Эйлера
- •Метод Трапеций
- •Решение задачи
- •Решение задачи с помощью математического пакета Scilab
- •Интерполяционная формула Лагранжа второго порядка в явном виде
- •Численное интегрирование
- •Основные результаты и выводы по работе
- •Список использованной литературы
- •Приложение а. Краткое описание используемых методов a.1. Метод Эйлера
- •A.2. Интерполяционная формула Лагранжа второго порядка в явном виде
- •A.3. Метод Трапеций
- •Приложение b. Тестирование функций, реализующих выбранные численные методы
- •B.1.Метод Эйлера с автоматическим выбором шага
- •B.2. Интерполяционная формула Лагранжа второго порядка в явном виде
- •B.3.Метод Трапеций с использованием двойного просчета
- •Приложение с. Детализированная схема алгоритма решение задачи
- •Приложение d. Код проекта
Приложение d. Код проекта
Option Strict On
Option Explicit On
Imports System.Math
Module Module1
'Процедура ввода исходных данных
Sub add(ByRef a As Double, ByVal t As TextBox)
a = Val(t.Text)
End Sub
'Процедура вывода массива значений y
Sub printLBy(ByRef masiv() As Double, ByRef l As ListBox)
Dim i As Integer
For i = 0 To UBound(masiv) - 1
l.Items.Add(Format(masiv(i), "0.0000000"))
Next i
End Sub
'Процедура вывода массива значений x
Sub printLBx(ByRef masiv() As Double, ByRef l As ListBox)
Dim i As Integer
For i = 0 To UBound(masiv) - 1
l.Items.Add(Format(masiv(i), "0.0"))
Next i
End Sub
'Пррцедуры, реализующей метод автоматического выбора шага
Sub Runge_step(ByVal x0 As Double, ByVal y0 As Double, ByVal h0 As Double, ByVal n As Integer, ByVal eps As Double, ByRef xm() As Double, ByRef ym() As Double)
Dim h, y, y1, x As Double
Dim m As Integer 'коэффициент дробления шага
Dim p As Integer
Dim i As Integer = 0
Form3.ListBox1.Items.Add(i)
Form3.ListBox4.Items.Add(vbNewLine)
Form3.ListBox5.Items.Add(vbNewLine)
p = 1 'метод Эйлер - это формула Рунге-Кутта 1 порядка отсюда следует ,что p=1
xm(0) = x0
ym(0) = y0
For i = 1 To n
h = h0
m = 1
y = r(x0, y0, h, m)
Do
y1 = y : h = h / 2
x = x0 : y = y0
m = 2 * m
y = r(x, y, h, m)
Loop Until Abs(y - y1) / (2 ^ p - 1) < eps
x0 = x0 + h0
y0 = y
xm(i) = x0
ym(i) = y0
Form3.ListBox1.Items.Add(i)
Form3.ListBox4.Items.Add(h)
Form3.ListBox5.Items.Add(m)
Next i
printLBx(xm, Form2.ListBox1)
printLBy(ym, Form2.ListBox2)
printLBx(xm, Form3.ListBox2)
printLBy(ym, Form3.ListBox3)
End Sub
'Процедура решения ОДУ методом Эйлера
Function r(ByVal x As Double, ByVal y As Double, ByVal h As Double, ByVal m As Double) As Double
For j = 1 To m
y = y + h * f_odu(x, y)
x = x + h
Next j
r = y
End Function
'Функция вычисления значения функции
Function f_odu(ByVal x As Double, ByVal y As Double) As Double
f_odu = Sqrt(x) + Sqrt(y)
End Function
' Процедура получения интеграла от таблицы решения ОДУ
Sub Integral_ot_ODU(ByRef ym() As Double, ByVal h As Double, ByRef integral_I As Double)
Dim i As Integer
Dim y0 As Double ' в эту переменную записывается значение y(0)
Dim y1_9 As Double 'в эту переменную записывается сумма значений y(1) до y(9)
Dim y10 As Double ' в эту переменную записывается значение y(10)
integral_I = 0
For i = 0 To UBound(ym)
If i = 0 Then
y0 = ym(i)
ElseIf (i <> 0) And (i <> UBound(ym) - 1) Then
y1_9 = y1_9 + ym(i)
Else
y10 = ym(i)
End If
Next i
integral_I = h / 2 * (y0 + 2 * (y1_9) + y10)
Form2.ListBox4.Items.Add(Format(integral_I, "0.0000000"))
End Sub
' Процедура получения полинома Лагранжа в явном виде
Sub Lagrange_polynom(ByRef xm() As Double, ByRef ym() As Double, ByRef a As Double, ByRef b As Double, ByRef c As Double)
Dim t As String
a = ym(0) / ((xm(0) - xm(5)) * (xm(0) - xm(10))) + ym(5) / ((xm(5) - xm(0)) * (xm(5) - xm(10))) + ym(10) / ((xm(10) - xm(0)) * (xm(10) - xm(5)))
b = (ym(0) * (-1) * (xm(5) + xm(10))) / (xm(0) - xm(5) * (xm(0) - xm(10))) - (ym(5) * (xm(0) + xm(10))) / ((xm(5) - xm(0)) * (xm(5) - xm(10))) - (ym(10) * (xm(0) + xm(5))) / ((xm(10) - xm(0)) * (xm(10) - xm(5)))
c = (ym(0) * xm(5) * xm(10)) / (xm(0) - xm(5) * (xm(0) - xm(10))) + (ym(5) * xm(0) * xm(10)) / ((xm(5) - xm(0)) * (xm(5) - xm(10))) + (ym(10) * xm(0) * xm(5)) / ((xm(10) - xm(0)) * (xm(10) - xm(5)))
t = Format(a, "0.00000") + "*" + "x^2" + "+" + Format(b, "0.00000") + "*" + "x" + "+" + CStr(c)
Form2.ListBox3.Items.Add(t)
End Sub
' Процедура получения интеграла от полинома Лагранжа 2 степени
Sub Integral_ot_Lagranga(ByVal a As Double, ByVal b As Double, ByVal eps As Double, ByVal aa As Double, ByVal bb As Double, ByVal cc As Double, ByRef integral_L As Double)
Dim n As Integer
Dim h As Double
Dim s, s1 As Double
Dim i As Integer
Dim p As Integer = 2 'метод Трапеций, p=2
n = 1
h = (b - a)
s = (Polynom(a, aa, bb, cc) + Polynom(b, aa, bb, cc)) * h / 2
Do
n = 2 * n
h = (b - a) / n
s1 = s
s = Polynom(a, aa, bb, cc) + Polynom(b, aa, bb, cc)
For i = 1 To n - 1
s = s + 2 * Polynom(a + i * h, aa, bb, cc)
Next i
s = s * h / 2
Form4.ListBox1.Items.Add(h)
Form4.ListBox2.Items.Add(Format(s, "0.0000000"))
Loop Until Abs(s - s1) / (2 ^ p - 1) < eps
integral_L = s
Form2.ListBox5.Items.Add(Format(s, "0.0000000"))
End Sub
'Функция, вычисляющая значение подынтегральной функции,
Function Polynom(ByVal x As Double, ByVal a As Double, ByVal b As Double, ByVal c As Double) As Double
Polynom = a * x ^ 2 + b * x + c
End Function
End Module
'Форма с исходных данных
Option Strict On
Option Explicit On
Imports System.Math
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Form2.Show()
Form2.Focus()
Me.Visible = False
Dim a As Double 'Левая граница отрезка и нижний предел интегрирования
Dim b As Double 'Правая граница отрезка и верхний предел интегрирования
Dim x0 As Double 'начальные условие ОДУ
Dim y0 As Double ' начальные условие ОДУ
Dim h0 As Double ' Шаг вычисления
Dim eps As Double ' Требуемая точность
Dim n As Integer
Dim integral_I As Double 'Интеграл, полученный от таблицы решения ОДУ
Dim integral_L As Double 'Интеграл, полученный от полинома Лагранжа 2 степени
Dim R As Double 'Погрешность от разницы Интегралов от таблицы решения ОДУ и полинома Лагранжа 2 степени
Dim aa As Double 'Коэффициент многочлена Лагранжа
Dim bb As Double 'Коэффициент многочлена Лагранжа
Dim cc As Double 'Коэффициент многочлена Лагранжа
add(a, TextBox1)
add(b, TextBox2)
add(x0, TextBox3)
add(y0, TextBox4)
add(h0, TextBox5)
add(eps, TextBox6)
n = CInt((b - a) / h0) 'количество точек в таблице
Dim xm(n + 1) As Double 'массив значений x(i)
Dim ym(n + 1) As Double ' массив значений y(i)
Runge_step(x0, y0, h0, n, eps, xm, ym)
Integral_ot_ODU(ym, h0, integral_I)
Lagrange_polynom(xm, ym, aa, bb, cc)
Integral_ot_Lagranga(a, b, eps, aa, bb, cc, integral_L)
R = integral_I - integral_L
Form2.ListBox6.Items.Add(Format(R, "0.0000000"))
Button1.Enabled = False
Button2.Enabled = True
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Form2.Show()
Form2.Focus()
Me.Visible = False
End Sub
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
End
End Sub
'Кнопка сброса для ввода новых значений
Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
Form2.ListBox1.Items.Clear() : Form3.ListBox1.Items.Clear() : Form4.ListBox1.Items.Clear()
Form2.ListBox2.Items.Clear() : Form3.ListBox2.Items.Clear() : Form4.ListBox2.Items.Clear()
Form2.ListBox3.Items.Clear() : Form3.ListBox3.Items.Clear()
Form2.ListBox4.Items.Clear() : Form3.ListBox4.Items.Clear()
Form2.ListBox5.Items.Clear() : Form3.ListBox5.Items.Clear()
Form2.ListBox6.Items.Clear()
Me.TextBox1.Text = ""
Me.TextBox2.Text = ""
Me.TextBox3.Text = ""
Me.TextBox4.Text = ""
Me.TextBox5.Text = ""
Me.TextBox6.Text = ""
Button1.Enabled = True
Button2.Enabled = False
End Sub
End Class
'Форма с основными результатами
Public Class Form2
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Form1.Show()
Form1.Focus()
Me.Visible = False
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
End
End Sub
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
form3.show()
Form3.Focus()
Me.Visible = False
End Sub
Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
Form4.show()
Form4.Focus()
Me.Visible = False
End Sub
End Class
' Форма с промежуточными результатами решение ОДУ
Public Class Form3
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Form2.Show()
Form2.Focus()
Me.Visible = False
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
End
End Sub
End Class
' Форма с промежуточными результатами интегрирования
Public Class Form4
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Form2.Show()
Form2.Focus()
Me.Visible = False
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
End
End Sub
End Class