Московського державного будівельного університету p>
Курсова робота p>
«Програма наближеного обчислення певного інтеграла за допомогою ф - ли Сімпсона на комп'ютері» p>
Виконав: студент ф -- та ЕОУС - 1 - 12 p>
Валюгін А. С. p>
Прийняв: p>
Зоткін С. П. p>
Москва 2001 p>
1. Введення p>
Визначений інтеграл від функції, що має неелементарную первісних,можна обчислити за допомогою тієї чи іншої наближеної формули. Для вирішенняцього завдання на комп'ютері, серед інших, можна скористатися формуламипрямокутників, трапецій або формулою Сімпсона. У даній роботірозглядається саме остання. p>
Розглянемо функцію y = f (x). Будемо вважати, що на відрізку [a, b] вонапозитивна і безперервна. Знайдемо площу криволінійної трапеції aABb (мал.
1). P>
рис. 1 p>
Для цього поділимо відрізок [a, b] точкою c = (a + b)/2 навпіл і в точці
C (c, f (c)) проведемо дотичну до лінії y = f (x). Після цього розділимо [a,b] точками p і q на 3 рівні частини і проведемо через них прямі x = p і x
= Q. Нехай P і Q - точки перетину цих прямих з дотичній. Поєднавши Aз P і B з Q, отримаємо 3 прямолінійні трапеції aAPp, pPQq, qQBb. Тодіплоща трапеції aABb можна приблизно порахувати за такою формулою p>
I ((aA + pP)/2 * h + (pP + qQ)/2 * h + (qQ + bB)/2 * h, де h = p>
(b - a)/3. p>
Звідки отримуємо p>
I ((b - a)/6 * (aA + 2 * (pP + qQ) + bB) p>
зауважимо, що aA = f (a), bB = f (b), а pP + qQ = 2 * f (c), у результаті отримуємомалу фор - лу Сімпсона p>
Мала формула Сімпсона дає інтеграл з хорошою точністю, коли графікпідінтегральною функції мало зігнутий, у випадках ж, коли дана більшескладна функція мала формула Сімпсона непридатна. Тоді, щоб порахуватиінтеграл заданої функції потрібно розбити відрізок [a, b] на n частин і докожному з відрізків застосувати формулу (1). Після наведених вище дійвийде "велика" формула Сімпсона, що має вигляд, p>
де Yкр = y1 + yn, Yнеч = y3 + y5 + ... + yn - 1, Yчет = y2 + y4 + ... + yn -
2, а h = (b - a)/n. p>
Завдання. Нехай потрібно проінтегрувати функцію f (x) = XІ (x - 5) І навідрізку [0, 6] (рис. 2). На цьому відрізку функція неперервна і приймаєтільки невід'ємні значення, тобто знакопостоянна. p>
рис. 2 p>
Для виконання поставленого завдання нижчеописаних складена програма,наближено обчислює певний інтеграл за допомогою формули Сімпсона.
Програма складається з трьох функцій main, f і integral. Функція main викликаєфункцію integral для обчислення інтеграла і роздруковує на екранірезультат. Функція f приймає аргумент x типу float і повертає значенняінтегрувальне функції в цій точці. Integral - основна функція програми:вона виконує всі обчислення, пов'язані з перебуванням певногоінтеграла. Integral приймає чотири параметри: межі інтегрування типуfloat, допустиму відносну помилку типу float і покажчик наінтегруються функцію. Обчислення виконуються до тих пір, покивідносна помилка, яка обчислюється за формулою p>
| (In/2 - In)/In |, p>
де In інтеграл при числі n розбивка, не буде менше необхідної. Наприклад,допустима відносна помилка e = 0.02 це означає, що максимальнапохибка у обчисленнях буде не більше, ніж In * e = 0.02 * In. Функціяреалізована за економією обчислень, тобто враховується, що Yкр постійна,а Yнеч = Yнеч + Yчет, тому ці значення обчислюються один раз. Високаточність і швидкість обчислення роблять використання програми на основіформули Сімпсона більш бажаним при наближеному обчисленні інтегралів,ніж використання програм на основі формули трапеції або методупрямокутників. p>
Нижче пропонується блок - схема, специфікації, лістинг і ручної рахунокпрограми на прикладі поставленої вище завдання. Блок - схема дозволяєвідстежити і зрозуміти особливості алгоритму програми, специфікації даютьподання про призначення кожної змінної в основної функції integral,лістинг - вихідний код працюючої програми з коментарями, а річний рахунокнадає можливість проаналізувати результати виконання програми. p>
2. Блок - схема програми p>
ТАК p>
НІ p>
3. Специфікації p>
| Ім'я змінної | Тип | Призначення |
| n | int | Число розбиття відрізка [a, b] |
| i | int | Лічильник циклів |
| a | float | Нижня межа інтегрування |
| b | float | Верхня межа інтегрування |
| h | float | Крок розбиття відрізка |
| e | float | Допустима відносна помилка |
| f | float | Покажчик на інтегруються фун - цію |
| | (*) | |
| s_ab | float | Сума значень фун - ції в точках a і |
| | | B |
| s_even | float | Сума значень фун - ції в непарних |
| | | Точках |
| s_odd | float | Сума значень фун - ції в парних |
| | | Точках |
| s_res | float | Поточний результат інтегрування |
| s_pres | float | Попередній результат інтегрування | p>
4. Лістинг програми p>
# include p>
# include p>
/* Прототип фун - ції, яка обчислює інтеграл */float integral (float, float, float, float (* ) (float )); p>
/* Прототип фун - ції, що задає інтегруються фун - цию */float f (float); p>
main () p>
(float result; p>
result = integral (0, 6, .1, f); printf ( "% f", result); p>
return 0; p> < p>) p>
/* Реалізація фун - ції, що задає інтегруються фун - цию p>
*/float f (float x) p>
( p> < p>/* Функція f (x) = XІ (x - 5) І */return pow (x, 3) * pow (x - 5, 2); p>
) p>
/* Реалізація фун - ції, яка обчислює інтеграл */float integral (float a, float b, float e, float p>
(* f) (float)) p>
(int n = 4, i;/* Початкове число розбиття 4 */float s_ab = f (a) + f (b);/* Сума значень фун - ції в a і b */float h = (b - a)/n;/* Обчислюємо крок */float s_even = 0, s_odd; float s_res = 0, s_pres; p>
/* Сума значень фун - ції в парних точках */for (i = 2; i ) do (s_odd = 0; s_pres = s_res; p>
/* Сума значень фун - ції в парних точках */for (i = 1; i ) p>
/* Підрахунок результату */s_res = h/3 * (s_ab + 2 * s_even + 4 * s_odd); p>
/* уникаємо ділення на нуль */if (s_res == 0) s_res = e; s_even + = s_odd; n *= 2; h/= 2; p>
) while (fabs ((s_pres - s_res)/s_res)> e );/* p>
Виконувати до тих пір, поки результат не буде задовольняти допустимої помилку */ p>
return fabs (s_res);/* Повертаємо результат */ p>
) p>
5. Ручний рахунок p>
Таблиця константних значень для n = 8
| Ім'я змінної | Значення |
| a | 0 |
| b | 6 |
| e | .1 |
| s_ab | 216 |
| h | .75 | p>
Підрахунок s_even
| i | a + i * | f (a + i * | s_even |
| | H | h) | |
| 2 | 1.5 | 41.34375 | 41.34375 |
| 4 | 3 | 108 | 149.34375 |
| 6 | 4.5 | 22.78125 | 172.125 | p>
Підрахунок s_odd
| i | a + i * | f (a + i | s_odd |
| | H | * h) | |
| 1 | .75 | 7.62012 | 7.6201 |
| | | | 2 |
| 3 | 2.25 | 86.14158 | 93.761 |
| | | | 7 |
| 5 | 3.75 | 82.3973 | 176.15 |
| | | | 9 |
| 7 | 5.25 | 9.044 | 185.20 |
| | | | 3 | p>
Підрахунок s_res
| (F (x) | s_res = h/3 * (s_ab + 2 * s_even + | Абсолютна помилка |
| dx | 4 * s_odd) | |
| 324 | 325.266 | 1.266 | p>
-----------------------< br>Введення a, b, e, f (x) p>
n = 4, h = (b - a)/n s_ab = f (a) + f (b) s_even = 0, s_res = 0
s_even = s_even +f (a ??????????????????????????????????????????????? ???????"???'??????????????< br>?????????????????????????????????????????????????? ???? † †??? + I * h) p>
i = 2, n - 1, 2 p>
s_odd = 0, s_pres = s_res p>
i = 1, n - 1, 2 p>
s_odd = s_odd + f (a + i * h) p>
s_res = h/3 * (s_ab + 2 * s_even + 4 * s_odd)s_even = s_even + s_odd, n = n/2, h = h/2 p>
| (s_pres - s_res)/s_res |> e p>
I ((b - a)/6 * (f (a) + 4 * f (c) + f (b)) (1) p>
Висновок s_res p>
I (h/3 * (Yкр + 2 * Yнеч + 4 * Yчет) (2) p>