Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4_1_2_3 Разработка программ со структурой вложе...doc
Скачиваний:
4
Добавлен:
23.11.2019
Размер:
335.36 Кб
Скачать

Пример программы вычисления определенного интеграла с точностью методом трапеций

  1. program integraltoch;

  2. {вычисление определенного интеграла с заданной точностью методом трапеций}

  3. { подынтегральная функция – X*Exp(X); первообразная функция (x-1)*Exp(X)}

  4. {$APPTYPE CONSOLE}

  5. uses

  6. SysUtils,Math;

  7. var

  8. A,B,Eps,I1,I2,Itoch,X,Dx,S1:Real;

  9. I,N,M,K:Integer;

  10. begin

  11. WriteLn('Введите пределы интегрирования и точность');

  12. ReadLn(A,B,Eps);

  13. //вычисление начального количества разбиений

  14. N:=Trunc((B-A)/Sqrt(Eps))+1;

  15. //начальное значение интеграла, взятое при n=1

  16. I2:=(A*Exp(A)+B*Exp(B))*(B-A)/2.0;

  17. //полусумма значений функции на нижнем и

  18. // верхнем пределах интегрирования

  19. S1:=(A*Exp(A) + B*Exp(B))/2.0;

  20. //начало внешнего цикла вычисления интеграла

  21. repeat

  22. //предыдущему значению интеграла присваивается текущее

  23. I1:=I2;

  24. //начальному значению суммы присваивается полусумма

  25. //значений функции на концах интервала интегрирования

  26. I2:=S1;

  27. //шаг изменения переменной интегрирования

  28. Dx:=(B-A)/N;

  29. //внутренний цикл для вычисления суммы значений

  30. //функции при фиксированном количестве шагов

  31. for I:=1 to N-1 do

  32. begin

  33. X:=A+I*Dx; // текущее значение аргумента

  34. //вычисление суммы значений функции в узлах интегрирования

  35. I2:=I2+X*Exp(X);

  36. end;

  37. I2:=I2*Dx; //текущее значение интеграла

  38. N:=N*2; //удвоение количества разбиений

  39. until Abs(I2-I1)/3<Eps; //анализ точности вычисление

  40. //вычисление количества позиций при выводе

  41. //числа с заданной точностью

  42. M:=Trunc(-Log10(Eps))+2;

  43. K:=Trunc(Log10(I2))+M+3;

  44. WriteLn('Значение интеграла =',I2:K:M

  45. ,' при количестве разбиений, равном ‘, N div 2);

  46. Itoch:=(B-1)*Exp(B)-(A-1)*Exp(A);//точное значение интеграла

  47. WriteLn('Точное значение интеграла равно ',Itoch:K:M);

  48. ReadLn;

  49. end.

Следует заметить, что метод трапеций удобен для вычисления интеграла по правилу Рунге, так как при увеличении количества разбиений в два раза каждый второй узел представляет собой ранее рассматривавшийся узел, поэтому вновь значения функции в этих точках вычислять не следует. Для этого следует сумму значений функции в этих узлах сохранять в переменной s2 .

Фрагмент модифицированной программы приведен ниже. В отличие от первого варианта программы до вложенного цикла необходимо написать цикл вычисления сумм значений функции при начальном разбиении интервала интегрирования для всех узлов, кроме первого и последнего.

  1. ReadLn(A,B,Eps);

  2. N:=Trunc((B-A)/Sqrt(Eps))+1;

  3. S1:=(A*Exp(A) + B*Exp(B))/2.0;

  4. S:=0;

  5. Dx:=(B-A)/N;

  6. //цикл вычисления суммы значений функции в узлах интегриро-

  7. //вания при начальном разбиении интервала интегрирования

  8. for I:=1 to N-1 do

  9. begin

  10. X:=A+I*Dx;

  11. S:=S+ X*Exp(X);

  12. end;

  13. I2:=Dx*(S+S1);

  14. S2:=S;

  15. repeat

  16. I1:=I2;

  17. N:=N*2;

  18. Dx:=(B-A)/N;

  19. X1:=A+Dx; //координата первого нового узла интегрирования

  20. S:=0;

  21. //цикл вычисления суммы значений функции в новых узлах

  22. // интегрирования

  23. for I:=1 to N div 2 do

  24. begin

  25. X:=X1+2*(I-1)*Dx;

  26. S:=S+ X*Exp(X);

  27. end;

  28. //сумма значений функции в узлах интегрирования при новом

  29. //числе разбиений

  30. S2:=S+S2;

  31. I2:=(S1+S2)*Dx;

  32. until Abs(I2-I1)/3<Eps;

Таким же образом можно сократить количество выполняемых операций при вычислении интеграла по методу левых или правых прямоугольников. Однако на практике при использовании метода прямоугольников значение функции вычисляют не на конце интервала (левом или правом), а в его середине. В этом случае при удвоении числа разбиений ранее вычисленные значения функции (и их сумму) использовать не удается. Для использования результатов ранее выполнявшихся вычислений при применении метода прямоугольников следует количество разбиений увеличивать в три раза и вычислять значения функции в точках с абсциссами Xi = Xнач +hi/6+h(i-1), i=1,n; Xj = Xнач +5hj/6+h(j-1), j=1,n. В приведенных выражениях Xнач – нижний предел интегрирования, h – шаг интегрирования и n – количество разбиений на предыдущей итерации.

При вычислении интеграла по методу Симпсона можно непосредственно использовать суммы значений функции, вычислявшиеся на предыдущей итерации. При этом надо иметь в виду, что узлы с нечетными номерами получают на очередной итерации четные индексы и сумма значений функции для этих узлов должна браться с коэффициентом 2 (на предыдущей итерации с коэффициентом 4). Узлы с четными номерами и при новой итерации останутся четными, поэтому сумма значений в этих узлах берется с тем же коэффициентом 2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]