Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Опорний конспект лекцій.doc
Скачиваний:
46
Добавлен:
11.02.2016
Размер:
3.99 Mб
Скачать

2. Огляд методів чисельного інтегрування.

При чисельному інтегруванні використовуються такі формули:

m

S ci f i ,

i=1

де m - кількість відрізків інтегрування;

ci – коефіцієнт, який визначається формулою чисельного інтегрування;

f i = f(x i)= yiзначення функції в точці i (i=0,1,2.. m).

2.1 Метод прямокутників.

Найпростіший прийом чисельного інтегрування, при якому функція y = f(x) замінюється інтерполяційним багаточленом нульового порядку. Для підвищення точності інтегрування відрізок [a, b] розбивається на m частин і формула прямокутника застосовується до кожного відрізку.

Площа прямокутника для елементарного відрізку дорівнює:

zi= f(x i) (x i+1 - x i) = yi x i

Для рівномірно розбитих відрізків маємо площу прямокутника: zi = h f(x i),

де h = x i =(x i+1 - x i)= (b-a) /m.

Сума площ всіх прямокутників дає формулу чисельного інтегрування (формулу прямокутників):

m-1

S h yi ,

i=0

Графічно метод можна представити у такому вигляді(мал.2):

y

x

Мал. 2

Точність даного методу залежить від способу формування прямокутників. За сторону прямокутника ми брали значенням функції в точці a, a+h і так до а+(m-1)*h. Отримали формулу”лівих” прямокутників. Дещо інший результат буде, якщо брати значенням функції в точці a+h. a+2h і так до b. Між цими значеннями буде розходження, що залежить від виду функції, що інтегрується. Можна також взяти значення функції посередині відрізка: f(x i) = f(a+h(i-0,5)). Отримаємо метод ”середніх” прямокутників. Через низьку точність ці методи застосовуються рідко.

2.2 Метод трапецій

Метод трапецій полягає в лінійній апроксимації f(x) на відрізку [a, b]. Для зменшення похибки відрізок [a, b] розбивається на m частин довжини h = (b-a)/m.

З урахуванням складання суміжних ординат усередині відрізка [a, b] узагальнена формула методу трапецій має вигляд: S h(y0/2 + y1 + y2+… yi+ ym-1 + ym/2) –R,

де похибка R = h2(b-a)f’’(z)/12

Тут f’’(z) максимальне значення другої похідної підінтегральної функції на відрізку [a, b].

Графічне представлення даного методу можна зобразити на малюнку3:

y

x

Мал. 3

Слід зазначити, що результат інтегрування по методу трапецій буде ідентичним щодо середнього арифметичного значення інтегрування двома способами методу прямокутників.

1.1.2 Метод Сімпсона (парабол)

Метод Сімпсона (парабол) - окремий випадок методу Ньютона - Котеса при n = 2. При розбивці відрізка [a, b] на m рівних відрізків одержимо формулу Сімпсона:

a

S =  f(x)dx [f(a) + 4 f(a+h) + 2 f(a+2h)+ 4 f(a+3h)+ 4 f(b-h)+ f(b)]h/3 – mh5fiv(z)

b

Вираз для залишкового члена показує, що формула Сімпсона точна, навіть якщо f(x) поліном третьої степені.

Графічне представлення елементарної ділянки інтегрування можна зобразити таким чином (мал.4):

x

Мал. 4

1.1.3Метод Ньютона-Котеса.

Метод Ньютона-Котеса заснований на інтерполяції f(x) у n проміжках поліномом Логранжа. У загальному випадку f(x) повинна задаватися (n+1) ординатами. Формули інтегрування точні, якщо f(x) - багаточлен n-ої степеня. При n = 1 отримуємо метод трапецій.

Опис алгоритму програми

1. Головна програма.

Розглянемо алгоритм головної програми.

Тому що в головній програмі в основному описуються екземпляри керуючих класів і організований головний цикл звертання до цих структур, а також через відсутність складних розгалужень представимо даний алгоритм на псевдокоді.

Вхідні дані: Функція, задана в аналітичному вигляді, межі інтегрування, кількість кроків інтегрування.

Вихідні дані: значення інтегралу, обчислене методами

  • Ньютона-Котеса

  • Прямокутників

  • Трапецій

  • Парабол (Симпсона)

Усереднене значення інтеграла по всіх методах

Крок 0. Початок

Крок 1. Підключити модулі з керуючими структурами і функціями інтегрування

#include <conio.h>

#include <stdio.h>

#include <iostream.h>

#include "integral.cpp"

#include "E:/modul/graph.cpp"

#include "E:/modul/mouse.cpp"

#include "E:/modul/abstr.cpp"

#include "E:/modul/baseinp.cpp"

#include "E:/modul/check.cpp"

#include "E:/modul/button.cpp"

#include "E:/modul/numedit.cpp"

#include "E:/modul/label.cpp"

#include "E:/modul/edit.cpp"

void main(){

clrscr();

Крок 2. Ініціалізувати графику і зафарбувати фон кольором №8

graphinit(8);

Крок 3.Ініціалізувати мишку

InitMouse();

Крок 4. Висвітити покажчик мишки

ShowMouse();

Крок 5. Оголосити об'єкти для відображення функції, яку інтегруємо

//Мітка для відображення виду функції

ClLabel funk(230,57,"Інтеграл функції f(x)=",15);

//Поле для введення самої функції

ClEdit FuncOfText(230,50,150,20,"x");

Крок 6. Оголосити об'єкти для введення меж інтегрування

//Поле введення початку проміжку інтегрування

ClLabel from(230,100,"Межі інтегрування: від ",11);

ClNumEdit a(230,100,70,20,0);

//Поле введення кінця проміжку інтегрування

ClLabel to(330,100,"до ",11);

ClNumEdit b(330,100,70,20,5);

Крок 7. Оголосити об'єкти для введення кількості кроків інтегрування

//Поле введення кількості кроків інтегрування

ClLabel shagi(270,150,"Кількість кроків інтегрування ",11);

ClNumEdit sh(280,150,100,25,100);

Крок 8. Оголосити об'єкти для виводу результатів інтегрування

//Поля виводу результатів

ClLabel rez(380,216,"Результат інтегрування: ",14);

ClLabel oldInt(500,220,"Попередні обчислення: ",10,1,1);

ClLabel sredn(400,10,"Середнє значення по всіх методах

",10);

ClNumEdit Sredn(400,10,200,25,0);

Крок 8.1. Оголосити об'єкти для виводу результатів методом Ньютона-Котеса

ClLabel kotesa(170,300,"Метод Ньютона-Котеса ",10);

ClNumEdit Kotesa(170,290,200,25,0);

ClNumEdit oldKotesa(400,290,200,25,0);

ClCheck sKotesa(380,295,0);

Крок 8.2. Оголосити об'єкти для виводу результатів методом прямокутників

ClLabel pryam(176,330,"Метод прямокутників ",10);

ClNumEdit Pryam(170,320,200,25,0);

ClNumEdit oldPryam(400,320,200,25,0);

ClCheck sPryam(380,325,0);

Крок 8.3. Оголосити об'єкти для виводу результатів методом трапецій

ClLabel trap(176,360,"Метод трапецій ",10);

ClNumEdit Trap(170,350,200,25,0);

ClNumEdit oldTrap(400,350,200,25,0);

ClCheck sTrap(380,355,0);

Крок 8.4. Оголосити об'єкти для виводу результатів методом Сімпсона

ClLabel parabol(176,390,"Метод парабол ",10);

ClNumEdit Parabol(170,380,200,25,0);

ClNumEdit oldParabol(400,380,200,25,0);

ClCheck sParabol(380,385,0);

Крок 9. Оголосити кнопку для визначення моменту необхідності обчислення інтеграла

//Кнопки для визначення інтеграла різними методами

ClButton start(400,150,100,25,"Порахувати");

Крок 10. Оголосити кнопку для виходу з програми

ClButton exit(10,10,50,20,"<--");

Крок 11. Визначити нескінченний цикл для забезпечення постійного запросу до всіх керуючих об'єктів програми for(;;){ Крок 11.1. Якщо натиснута кнопка виходу, то вийти з програми

if (exit.zapros()) break;

Крок 11.2. Якщо натиснута кнопка «Порахувати інтеграл», то обчислити інтеграл всіма методами і записати результати у відповідні поля виводу значень

if (start.zapros()){

}

Крок 11.2. Якщо скинутий прапорець напроти поля виводу значення інтегралу методом Ньютона-Котеса, то зберегти попереднє значення інтегралу й обчислити його нове значення по цьому методу

if (sKotesa.

GetState()==0){

oldKotesa.SetNum(Kotesa.Num);

Kotesa.SetNum(metod_Nyutona_Kotesa(FuncOfText.text, a.Num, b.Num, sh.Num));

}

Крок 11.3. Якщо скинутий прапорець напроти поля виводу значення інтеграла методом прямокутників, то зберегти попереднє значення інтегралу й обчислити його нове значення цим методом.

if (sPryam.GetState()==0){

oldPryam.SetNum(Pryam.Num);

Pryam.SetNum(metod_Pryam

(FuncOfText.text, a.Num, b.Num, sh.Num));

}

Крок 11.4. Якщо скинутий прапорець напроти поля виводу значення інтеграла за методом трапецій, то зберегти попереднє значення інтеграла й обчислити його нове значення цим методом.

if (sTrap.GetState()==0){

oldTrap.SetNum(Trap.Num);

Trap.SetNum

(metod_Trap(FuncOfText.text, a.Num, b.Num, sh.Num));

}

Крок 11.5. Якщо скинутий прапорець навпроти поля виводу значення інтеграла за методом парабол, то зберегти попереднє значення інтеграла й обчислити його нове значення цим методом.

if (sParabol.GetState()==0){

oldParabol.SetNum(Parabol.Num);

Parabol.SetNum(metod_Parabol(FuncOfText.text, a.Num,

b.Num, sh.Num));

Крок 11.6. Обчислити усереднене значення інтеграла

//Обчислення усередненого значення

Sredn.SetNum((Parabol.Num + Trap.Num + Uedlya.Num +

Bode.Num + Kotesa.Num + Chebisheva.Num + Gaussa.Num)/7);

};

Крок 11.7. Зробити запит на зміну стану об’єктів уведення границь інтегрування і кількості кроків.

a.zapros();

b.zapros();

sh.zapros();

Крок 11.8. Зробити запит на зміни стану прапорців допустимості обчислення інтеграла.

sBode.zapros();

sUedlya.zapros();

sKotesa.zapros();

sPryam.zapros();

sTrap.zapros();

sParabol.zapros();

sKotesa.zapros();

}

Крок 11.9. Якщо натиснута клавіша Esc вийти з програми.

if (kbhit()) if (getch()==27) break;

}

Крок 12. Закрити графічний режим.

closegraph();

Крок 13. Кінець.

}