Условие:
Вычислить интеграл с заданной точностью E=0.001 Отрезок интегрирования [a,b] сначала разбивается на 2n равных частей и строится сумма S2n , которая является приближенным значением интеграла, затем количество частей разбиения увеличивается, например, вдвое и строится сумма S4n. Если выполняется условие, то S4n считается значением интеграла с точностью E.
Для расчета суммы S2n используйте формулу Симпсона:
где h – шаг разбиения отрезка интегрирования h=(b-a)/2n.
Программа должна содержать две пользовательские функции, определяющие:
1) вид подынтегрального выражения;
2) вычисление суммы S2n.
Решение:
Решение любой задачи программирования лучше начинать с примерного алгоритма решения, которое записано на языке, понятном любому человеку. Это делается для того, чтобы тому, кто будет после вас работать с программной частью, было легче разобраться в "исходниках" вашей программы.
Итак, словесный алгоритм:
- создаем первую функцию для выражения, которое интегрируем;
- создаем вторую функцию, в которой вычисляем S2. по формуле данной в условии.
- делаем до тех пор, пока j < e, j= | S(4N) - S(2N) | и выводим S(4N)-это и есть искомый интеграл.
Небольшие дополнения:
возможны неправильные обозначения или выражения, которые могут быть привязаны к конкретному языку программирования; а также нехватка стрелок, некрасивые и др. обозначений(ромбов, треугольников и т. д.), которые нужны по ISO.
Исходный код:(иногда ещё его называют листинг)
#include<conio.h>
#include<math.h>
float f(float x)
{
return (sqrt(exp(x)-1));
}
float S(int n)
{
int i;
float S1, S2, h, a=0, b=log(2);
h =(b - a) / (2*n);
for (i = 1; i <= 2*n-1; i++)
{
if (i % 2 == 0)
S1 += 2 * f(a + i * h);
else S1+= 4 * f(a + i * h);
}
S2=((f(a)+f(b)+S1))*h/3;
return S2;
}
main()
{
float N = 12, q=2*N, w=4*N;
float c, d, e, k, j;
clrscr();
q=2*N;
w=4*N;
e=0.001;
c = S(q);
do
{
d = c;
q*=2;
c=S(q);
}
while(fabs(d-c))>e);
k=S(q);
printf("\nIntegral: %f", k);
getch();
return 0;
}
Результат: