| |||
Реферат: Метод Симпсона на компьютереМОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ СТРОИТЕЛЬНЫЙ УНИВЕРСИТЕТ КУРСОВАЯ РАБОТА «Программа приближенного вычисления определенного интеграла с помощью ф – лы Симпсона на компьютере» Выполнил: студент ф – та ЭОУС – 1 – 12 Валюгин А. С. Принял: Зоткин С. П. Москва 2001 1. Введение Определенный интеграл от функции, имеющей неэлементарную первообразную, можно вычислить с помощью той или иной приближенной формулы. Для решения этой задачи на компьютере, среди прочих, можно воспользоваться формулами прямоугольников, трапеций или формулой Симпсона. В данной работе рассматривается именно последняя. Рассмотрим функцию y = f(x). Будем считать, что на отрезке [a, b] она
положительна и непрерывна. Найдем площадь криволинейной трапеции aABb (рис. [pic] рис. 1 Для этого разделим отрезок [a, b] точкой c = (a + b) / 2 пополам и в точке I ( (aA + pP) / 2 * h + (pP + qQ) / 2 * h + (qQ + bB) / 2 * h, где h = (b – a) / 3. Откуда получаем I ( (b – a) / 6 * (aA + 2 * (pP + qQ) + bB) заметим, что aA = f(a), bB = f(b), а pP + qQ = 2 * f(c), в итоге получаем малую фор – лу Симпсона Малая формула Симпсона дает интеграл с хорошей точностью, когда график подинтегральной функции мало изогнут, в случаях же, когда дана более сложная функция малая формула Симпсона непригодна. Тогда, чтобы посчитать интеграл заданной функции нужно разбить отрезок [a, b] на n частей и к каждому из отрезков применить формулу (1). После указанных выше действий получится “большая” формула Симпсона, которая имеет вид, где Yкр = y1 + yn, Yнеч = y3 + y5 + … + yn – 1, Yчет = y2 + y4 + … + yn – Задача. Пусть нужно проинтегрировать функцию f(x) = xі(x - 5)І на отрезке [0, 6] (рис. 2). На этом отрезке функция непрерывна и принимает только неотрицательные значения, т. е. знакопостоянна. [pic] рис. 2 Для выполнения поставленной задачи составлена нижеописанная программа,
приближенно вычисляющая определенный интеграл с помощью формулы Симпсона. | (In/2 – In) / In | , где In интеграл при числе разбиений n, не будет меньше требуемой. Например, допустимая относительная ошибка e = 0.02 это значит, что максимальная погрешность в вычислениях будет не больше, чем In * e = 0.02 * In. Функция реализована с экономией вычислений, т. е. учитывается, что Yкр постоянная, а Yнеч = Yнеч + Yчет, поэтому эти значения вычисляются единожды. Высокая точность и скорость вычисления делают использование программы на основе формулы Симпсона более желательным при приближенном вычислении интегралов, чем использование программ на основе формулы трапеции или метода прямоугольников. Ниже предлагается блок – схема, спецификации, листинг и ручной счет программы на примере поставленной выше задачи. Блок – схема позволяет отследить и понять особенности алгоритма программы, спецификации дают представление о назначении каждой переменной в основной функции integral, листинг - исходный код работающей программы с комментариями, а ручной счет предоставляет возможность проанализировать результаты выполнения программы. 2. Блок – схема программы ДА НЕТ 3. Спецификации |Имя переменной|Тип |Назначение | 4. Листинг программы #include #include /* Прототип фун – ции, вычисляющей интеграл */ float integral(float, float, float, float (*)(float)); /* Прототип фун – ции, задающей интегрируемую фун – цию */ float f(float); main() { float result; result = integral(0, 6, .1, f); printf("%f", result); return 0; } /* Реализация фун – ции, задающей интегрируемую фун – цию */ float f(float x) { /* Функция f(x) = xі(x - 5)І */ return pow(x, 3) * pow(x - 5, 2); } /* Реализация фун – ции, вычисляющей интеграл */ float integral(float a, float b, float e, float (*f)(float)) { 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; /* Сумма значений фун – ции в нечетных точках */ for (i = 2; i < n; i += 2) { s_even += f(a + i * h); } do { s_odd = 0; s_pres = s_res; /* Сумма значений фун – ции в четных точках */ for (i = 1; i < n; i += 2) { s_odd += f(a + i * h); } /* Подсчет результата */ s_res = h / 3 * (s_ab + 2 * s_even + 4 * s_odd); /* Избегаем деления на ноль */ if (s_res == 0) s_res = e; s_even += s_odd; n *= 2; h /= 2; } while (fabs((s_pres - s_res) / s_res) > e);/* Выполнять до тех пор, пока результат не будет удовлетворять допустимой ошибке */ return fabs(s_res); /* Возвращаем результат */ } 5. Ручной счет Таблица константных значений для n = 8 Подсчет s_even Подсчет s_odd Подсчет s_res ----------------------- n = 4, h = (b – a) / n s_ab = f(a) + f(b) s_even = 0, s_res = 0 s_even = s_even +
f(a??????????????????????????????????????????????????????"???'?????????????? i = 2, n – 1, 2 s_odd = 0, s_pres = s_res i = 1, n – 1, 2 s_odd = s_odd + f(a + i * h) s_res = h / 3 * (s_ab + 2 * s_even + 4 * s_odd) s_even = s_even + s_odd, n = n / 2, h = h / 2 | (s_pres – s_res) / s_res | > e I ( (b – a) / 6 * (f(a) + 4 * f(c) + f(b)) (1) Вывод s_res I ( h / 3 * (Yкр + 2 * Yнеч + 4 * Yчет) (2) |
|