- •Министерство образования и науки Российской Федерации
- •Пояснительная записка
- •Содержание
- •Теоретическая часть Метод прямоугольников
- •Метод Симпсона
- •Описание программы
- •1.Тело программы.
- •Блок-схемы методов Метод прямоугольников
- •Метод Симпсона Вывод
- •Список литературы
- •1. Кудрявцев л.Д. Курс математического анализа. Учебник, т. 1, 2, 3 // м.: Высшая школа, 1988, 1989.
Метод Симпсона
Для приближённого вычисления интеграла
функции f(x) используются методы
приближённого интегрирования, наиболее
употребительные из них основаны на
замене интеграла конечной суммой. Для
вычисления
промежуток
от a(x0) до b(xn) разбивается на
n равных частей, и для точек деления x0
, x1 , x2 , x3 , . . . , xn-1
, xn вычисляются значения интегрируемой
функции y. Затем необходимо воспользоваться
формулой приближённого интегрирования:
Формула Cимпсона (парабол) (рис.2) :
(2)
Рис.2.
В курсовой работе рассматривается приближенное вычисление интеграла
(1)
При его аппроксимации заменим функцию
f(x) параболой, проходящей через точки
т.е представим приближенно f(x) в виде:
где
- интерполяционный многочлен Лагранжа
второй степени,
.
(2)
Проводя интегрирование получим
Таким образом приходим к приближенному равенству
(3)
Котрое называется формулой Симпсона или формулой парабол.
На всем отрезке [a,b] формула Симпсона имеет вид
Чтобы не использовать дробных индексов можно обозначить
xi=a+0,5hi, fi=f(xi), i=1,2,…,2N, hN=b-a
и записать формулу Симпсона в виде:
(4)
Прежде чем переходить к оценке погрешности формулы (3) заметим, что она является точной для любого многочлена третьей степени, т.е. имеет место точное равенство
если f(x)=a0+a1x+a2x2+a3x3. Это утверждение нетрудно проверить непосредственно.
Для оценки погрешности формулы Симпсона воспользуемся интерполяционным многочленом Эрмита. Построим многочлен третьей степени H3(x) такой, что
.
Такой многочлен существует и единствен.
Однако нам даже не потребуется явный вид многочлена H3(x). Вспоминая, что формула Симпсона точна для любого многочлена третьей степени, получим
(5)
Представим теперь f(x) в виде
f(x)=H3(x)+ri(x),
x[xi-1,xi],
(6)
где ri(x) – погрешность интерполирования многочленом Эрмита H3(x). Интегрируя (6) и учитывая (5), получим
(7)
Далее имеем
поэтому из (7) для погрешности
формулы (3) получаем оценку
где
Вычисляя интеграл приходим к окончательной оценке
(8)
Погрешность составной формулы Симпсона оценивается так
(9)
Отсюда видно, что формула Симпсона существенно точнее, чем формулы прямоугольников и трапеций. На частичном отрезке она имеет точность О(h5), а на всем отрезке – O(h4).
Описание программы
1.Тело программы.
рис 1. Окно программы до вычислений
Option Explicit
Private Sub Enter_Click()
Form4.Show (1)
End Sub
Private Sub Form_Unload(Cancel As Integer)
End
End Sub
Private Sub Preview_Click()
Form2.Show (1)
End Sub
Private Sub rects_Click()
Dim n As Integer, k As Integer
Dim y As Double, y1 As Double, x As Double, r As Double, s As Double
Dim tmp As Double, minf As Double, maxf As Double
Dim a As Double, b As Double, sw As Double, sh As Double, zv As Double, kor As Double
a = Val(Form4.Text1.Text) 'чтение введённого значения a
b = Val(Form4.Text2.Text) 'чтение введённого значения b
n = Val(Form4.Text3.Text) 'чтение введённого значения n
If (n <= 0) Or (a >= b) Then 'проверка корректности данных
MsgBox ("Введены некорректные данные") 'вывод сообщения об ошибке
Exit Sub 'выход из функции
End If 'конец проверки
sw = b - a 'вычисление масштаба по оси x
kor = ((-18 + 6 * 33 ^ (1 / 2.5)) ^ (1 / 2.5)) / 6
minf = f(a)
maxf = f(a)
If minf > f(b) Then minf = f(b)
If maxf < f(b) Then maxf = f(b)
If (a >= kor) And (b <= kor) Then
If minf > f(kor) Then minf = f(kor)
If maxf < f(kor) Then maxf = f(kor)
End If
If (a >= -kor) And (b <= -kor) Then
If minf > f(-kor) Then minf = f(-kor)
If maxf < f(-kor) Then maxf = f(-kor)
End If
sh = maxf - minf 'вычисление масштаба по оси y
zv = maxf
If maxf < 0 Then zv = 0
If minf > 0 Then zv = sh
r = (Log((b ^ 2 + 1) / (b ^ 2 + 2.5)) - Log((a ^ 2 + 1) / (a ^ 2 + 2.5))) 'реальное значение
Form5.Picture1.Cls 'очистка области рисования
Form5.Picture1.DrawWidth = 1 'установка тонкого пера
Form5.Picture1.ScaleWidth = sw 'установка масштаба по оси x
Form5.Picture1.ScaleHeight = sh 'установка масштаба по оси y
For tmp = minf To maxf Step sh / 10 'цикл - рисование засечек по оси y
Form5.Picture1.Line (0, maxf - tmp)-(sw / 40, maxf - tmp) ' рисование засечки в точке tmp
Form5.Picture1.CurrentX = sw / 40 'установка текущего значения координаты пера по оси x
Form5.Picture1.CurrentY = maxf - tmp 'установка текущего значения координаты пера по оси y
Form5.Picture1.Print Format(tmp, "#0.00") 'вывод подписи при зесечке с двумя знаками после запятой
Next tmp 'конец цикла
Form5.Picture1.Line (0, zv)-(sw, zv)
For tmp = a To b Step sw / 10 'цикл - рисование засечек по оси x
Form5.Picture1.Line (tmp - a, zv)-(tmp - a, zv - sh / 40) ' рисование засечки в точке tmp
Form5.Picture1.CurrentX = tmp - a 'установка текущего значения координаты пера по оси x
Form5.Picture1.CurrentY = zv - sh / 20 'установка текущего значения координаты пера по оси y
Form5.Picture1.Print Format(tmp, "#0.00") 'вывод подписи при зесечке с двумя знаками после запятой
Next tmp 'конец цикла
s = 0 'начальное значение интеграла
y1 = f(a) 'начальное значение функции
Form5.Picture1.DrawWidth = 2 'установка жирного пера
For k = 1 To 500 'цикл - рисование графика функции
x = a + (b - a) * k / 500 'вычисление x
y = f(x) 'вычисление y
Form5.Picture1.Line (x - a - (x - a) / 500, maxf - y1)-(x - a, maxf - y) 'рисование части графика
y1 = y 'запоминание текущего результата для использывания на следующем шаге
Next k 'конец цикла
y1 = f(a) 'начальное значение функции
Form5.Picture1.DrawWidth = 1 'установка тонкого пера
For k = 1 To n 'цикл - вычисление интеграла и рисование прямоугольников
x = a + (b - a) * k / n 'вычисление x
y = f(x) 'вычисление y
Form5.Picture1.Line (x - (b - a) / n - a, zv)-(x - (b - a) / n - a, maxf - y1) 'рисование левой стороны прямоугольника
Form5.Picture1.Line (x - (b - a) / n - a, maxf - y1)-(x - a, maxf - y1) 'рисование верхней стороны прямоугольника
Form5.Picture1.Line (x - a, maxf - y1)-(x - a, zv) 'рисование правой стороны прямоугольника
s = s + (b - a) * y1 / n 'формула прямоугольника
y1 = y 'запоминание текущего результата для использывания на следующем шаге
Next k 'конец цикла
Form5.Label1.Caption = "Точное решение: " + CStr(Abs(r)) 'вывод точного решения
Form5.Label2.Caption = "Решение методом прямоугольников: " + CStr(Abs(s)) 'вывод решения методом прямоугольников
Form5.Show (1) 'модальный показ формы с рисунком
End Sub
рис 2. Метод прямоугольников
Private Sub Researh_Click()
Dim n As Integer, i As Integer
Dim yp As Double, x As Double, r As Double, yt As Double, a As Double, b As Double
Dim yp1 As Double, sp As Double, st As Double, tmp As Double, yt1 As Double
Dim sh As Double
a = 1
b = 2.5
r = (Log((b ^ 2 + 1) / (b ^ 2 + 2.5)) - Log((a ^ 2 + 1) / (a ^ 2 + 2.5))) 'реальное значение
Form1.Picture1.DrawWidth = 1 'установка тонкого пера
Form1.Picture1.ForeColor = QBColor(0) 'установка чёрного цвета линии
Form1.Picture1.ScaleWidth = 190 'установка масштаба по оси x
sh = 0.005
Form1.Picture1.ScaleHeight = sh 'установка масштаба по оси y
For tmp = 0 To sh Step sh / 10 'цикл - рисование засечек по оси y
Form1.Picture1.Line (0, sh - tmp)-(2, sh - tmp) ' рисование засечки в точке tmp
Form1.Picture1.CurrentX = 2 'установка текущего значения координаты пера по оси x
Form1.Picture1.CurrentY = sh - tmp 'установка текущего значения координаты пера по оси y
Form1.Picture1.Print tmp 'вывод подписи при зесечке
Next tmp 'конец цикла
For tmp = 10 To 200 Step 10 'цикл - рисование засечек по оси x
Form1.Picture1.Line (tmp - 10, sh)-(tmp - 10, sh - sh / 40) ' рисование засечки в точке tmp
Form1.Picture1.CurrentX = tmp - 15 'установка текущего значения координаты пера по оси x
Form1.Picture1.CurrentY = sh - 40 'установка текущего значения координаты пера по оси y
Form1.Picture1.Print tmp 'вывод подписи при зесечке
Next tmp 'конец цикла
Form1.Picture1.DrawWidth = 2 'установка жирного пера
For n = 10 To 200 Step 10 'цикл - разное количество шагов
sp = 0 'начальное значение интеграла
st = 0 'начальное значение интеграла
For x = a To b - 0.000001 Step (b - a) / n 'цикл - вычисление интеграла
sp = sp + f(x) * (b - a) / n 'формула левых прямоугольников
Next x 'конец цикла
i = 1
Do While i <= n
x = a + (b - a) * i / n
st = st + (b - a) * (f(x - 2 * (b - a) / n) + 4 * f(x - (b - a) / n) + f(x)) / (3 * n) 'формула симпсона
'st = st + (b - a) * 2 * (f(x) + 2 * f(x - 1 / n)) / (3 * n) 'формула симпсона
i = i + 2
Loop
yp = sh - Abs(sp - r) 'вычисление координаты точки, соответствующей sp
yt = sh - Abs(st - r) 'вычисление координаты точки, соответствующей st
Form1.Picture1.ForeColor = QBColor(3) 'установка морской волны цвета линии
Form1.Picture1.Line (n - 20, Abs(yp1) / 10)-(n - 10, Abs(yp) / 10) 'рисование части линии
Form1.Picture1.ForeColor = QBColor(10) 'установка зеленого цвета линии
Form1.Picture1.Line (n - 20, Abs(yt1) / 10)-(n - 10, Abs(yt) / 10) 'рисование части линии
yp1 = yp 'сохранение текущего результата для следующей итерации
yt1 = yt 'сохранение текущего результата для следующей итерации
Next n 'конец цикла
Form1.Show (1)
End Sub
рис 4. Исследование сходимости разных методов
Private Sub simpson_Click()
Dim n As Integer, k As Integer
Dim y As Double, y1 As Double, x As Double, r As Double, s As Double
Dim tmp As Double, minf As Double, maxf As Double
Dim a As Double, b As Double, sw As Double, sh As Double
Dim q As Double, q1 As Double, aq As Double, bq As Double, cq As Double
Dim h As Double, x1q As Double, x2q As Double, x3q As Double, zv As Double, kor As Double
a = Val(Form4.Text1.Text) 'чтение введённого значения a
b = Val(Form4.Text2.Text) 'чтение введённого значения b
n = Val(Form4.Text3.Text) 'чтение введённого значения n
If (n <= 0) Or (a >= b) Then 'проверка корректности данных
MsgBox ("Введены некорректные данные") 'вывод сообщения об ошибке
Exit Sub 'выход из функции
End If 'конец проверки
sw = b - a 'вычисление масштаба по оси x
kor = ((-18 + 6 * 33 ^ (1 / 2.5)) ^ (1 / 2.5)) / 6
minf = f(a)
maxf = f(a)
If minf > f(b) Then minf = f(b)
If maxf < f(b) Then maxf = f(b)
If (a >= kor) And (b <= kor) Then
If minf > f(kor) Then minf = f(kor)
If maxf < f(kor) Then maxf = f(kor)
End If
If (a >= -kor) And (b <= -kor) Then
If minf > f(-kor) Then minf = f(-kor)
If maxf < f(-kor) Then maxf = f(-kor)
End If
sh = maxf - minf 'вычисление масштаба по оси y
zv = maxf
If maxf < 0 Then zv = 0
If minf > 0 Then zv = sh
r = (Log((b ^ 2 + 1) / (b ^ 2 + 2.5)) - Log((a ^ 2 + 1) / (a ^ 2 + 2.5))) 'реальное значение
Form5.Picture1.Cls 'очистка области рисования
Form5.Picture1.DrawWidth = 1 'установка тонкого пера
Form5.Picture1.ScaleWidth = sw 'установка масштаба по оси x
Form5.Picture1.ScaleHeight = sh 'установка масштаба по оси y
For tmp = minf To maxf Step sh / 10 'цикл - рисование засечек по оси y
Form5.Picture1.Line (0, maxf - tmp)-(sw / 40, maxf - tmp) ' рисование засечки в точке tmp
Form5.Picture1.CurrentX = sw / 40 'установка текущего значения координаты пера по оси x
Form5.Picture1.CurrentY = maxf - tmp 'установка текущего значения координаты пера по оси y
Form5.Picture1.Print Format(tmp, "#0.00") 'вывод подписи при зесечке с двумя знаками после запятой
Next tmp 'конец цикла
Form5.Picture1.Line (0, zv)-(sw, zv)
For tmp = a To b Step sw / 10 'цикл - рисование засечек по оси x
Form5.Picture1.Line (tmp - a, zv)-(tmp - a, zv - sh / 40) ' рисование засечки в точке tmp
Form5.Picture1.CurrentX = tmp - a 'установка текущего значения координаты пера по оси x
Form5.Picture1.CurrentY = zv - sh / 20 'установка текущего значения координаты пера по оси y
Form5.Picture1.Print Format(tmp, "#0.00") 'вывод подписи при зесечке с двумя знаками после запятой
Next tmp 'конец цикла
s = 0 'начальное значение интеграла
y1 = f(a) 'начальное значение функции
Form5.Picture1.DrawWidth = 2 'установка жирного пера
For k = 1 To 500 'цикл - рисование графика функции
x = a + (b - a) * k / 500 'вычисление x
y = f(x) 'вычисление y
Form5.Picture1.Line (x - a - (x - a) / 500, maxf - y1)-(x - a, maxf - y) 'рисование части графика
y1 = y 'запоминание текущего результата для использывания на следующем шаге
Next k 'конец цикла
y1 = f(a) 'начальное значение функции
Form5.Picture1.DrawWidth = 1 'установка тонкого пера
k = 2
Do While k <= n 'цикл - вычисление интеграла и рисование графика
x = a + (b - a) * k / n 'вычисление x
y = f(x) 'вычисление y
Form5.Picture1.Line (x - 2 * (b - a) / n - a, zv)-(x - 2 * (b - a) / n - a, maxf - y1) 'рисование левой стороны криволинейной трапеции
x1q = x - 2 * (b - a) / n
x2q = x - (b - a) / n
x3q = x
h = (b - a) / n
aq = (f(x1q) - 2 * f(x2q) + f(x3q)) / (2 * h * h) 'вычисление коэффициентов параболы
bq = (f(x3q) - f(x1q)) / (2 * h) - aq * (x1q + x3q) 'вычисление коэффициентов параболы
cq = f(x1q) - aq * x1q * x1q - bq * x1q 'вычисление коэффициентов параболы
For q = x1q To x3q Step h / 10 ' рисование параболы
Form5.Picture1.Line (q - h / 10 - a, maxf - (aq * (q - h / 10) * (q - h / 10) + bq * (q - h / 10) + cq))-(q - a, maxf - (aq * q * q + bq * q + cq))
Next q
Form5.Picture1.Line (x - a, maxf - y)-(x - a, zv) 'рисование правой стороны криволинейной трапеции
's = s + aq * (x3q ^ 3 - x1q ^ 3) / 3 + bq * (x3q ^ 2 - x1q ^ 2) / 2 + cq * (x3q - x1q) 'другая формула
s = s + h * (f(x1q) + 4 * f(x2q) + f(x3q)) / 3 'формула симпсона
y1 = y 'запоминание текущего результата для использывания на следующем шаге
k = k + 2
Loop 'конец цикла
Form5.Label1.Caption = "Точное решение: " + CStr(Abs(r)) 'вывод точного решения
Form5.Label2.Caption = "Решение методом Симпсона: " + CStr(Abs(s)) 'вывод решения методом Симпсона
Form5.Show (1) 'модальный показ формы с рисунком
End Sub
Private Function f(q As Double) As Double
f = (1 / (q ^ 2)) * (Sin(1 / q))
End Function
рис 3. Метод Симпсона
После этого программу можно закрыть и посмотреть точные результаты в текстовом файле в папке с курсовой работой.
