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

Пример выполнения задания на составление рекурсивной подпрограммы

Вычислить значение определенного интеграла, если соответствующий неопределенный интеграл и первообразная функция имеют следующий вид [10]:

Вычисление определённого интеграла произвести двумя способами:1) с использованием приведенных выражений, вычисляемых рекурсивными подпрограммами (точное значение) и 2) с помощью численных методов (приближенно).

В основной программе необходимо осуществить ввод исходных данных – параметров p,q,m, пределов интегрированияa,bи точности ε, с которой будет вычисляться интеграл численными методами. Сравнить полученные результаты.

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

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

  1. program PrimerRecPodp;

  2. {$APPTYPE CONSOLE}

  3. uses

  4. SysUtils,Math;

  5. var

  6. p,q,a,b,int1,int2,eps:Real;

  7. m,l,k:Integer;

  8. //Рекурсивная функция вычисления второго интеграла

  9. function Integ1(p,q:Real;m:Integer;x:Real):Real;

  10. begin

  11. if m>=2 then

  12. Integ1:=x/(2*(m-1) *Power((p*p-q*q*x*x),m-1))*p*p

  13. +(2*m-3)/(2*(m-1)*p*p)*Integ1(p,q,m-1,x)

  14. else if m=1 then

  15. Integ1:=Ln(Abs((p+q*x)/(p-q*x)))/(2*p*q);

  16. end;

  17. //Рекурсивная функция исходного интеграла

  18. function Integ(p,q:Real;m:Integer;x:Real):Real;

  19. begin

  20. if m>=2 then

  21. Integ:=x/(2*(m-1)*q*q*Power((p*p-q*q*x*x),m-1))

  22. -1/(2*(m-1)*q*q)*Integ1(p,q,m-1,x)

  23. else if m=1 then

  24. Integ:=-x/(q*q)+p/(2*q*q*q)*Ln(Abs((p+q*x)/(p-q*x)));

  25. end;

  26. //Функция вычисления интеграла по методу парабол (Симпсона)

  27. function SimpsonMod(a,b,eps,p,q:Real;m:Integer):Real;

  28. var

  29. n,i:Integer;

  30. x,dx,sch,snch,s1,s2,i1,i2:Real;

  31. begin

  32. n:=Trunc((b-a)/Sqrt(Sqrt(eps)))+1;

  33. if Odd(n) then n:=n+1;

  34. s1:=a*a/Power((p*p-q*q*a*a),m);

  35. s2:=b*b/Power((p*p-q*q*b*b),m);

  36. sch:=0;

  37. snch:=0;

  38. dx:=(b-a)/n;

  39. for i:=1 to n div 2 do

  40. begin

  41. x:=a+2*i*dx;

  42. sch:=sch+x*x/Power((p*p-q*q*x*x),m);

  43. x:=a+(2*i-1)*dx;

  44. snch:=snch+x*x/Power((p*p-q*q*x*x),m);

  45. end;

  46. sch:=sch-s2;

  47. i2:=(s1+s2+4*snch+2*sch)*dx/3;

  48. repeat

  49. i1:=i2;

  50. n:=n*2;

  51. dx:=(b-a)/n;

  52. sch:=snch+sch;

  53. snch:=0;

  54. for i:=1 to n div 2 do

  55. begin

  56. x:=a+(2*i-1)*dx;

  57. snch:=snch+x*x/Power((p*p-q*q*x*x),m);

  58. end;

  59. i2:=(s1+s2+4*snch+2*sch)*dx/3;

  60. until Abs(i2-i1)/3<eps;

  61. Result:=i2;

  62. end;

  63. begin// РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

  64. Writeln('Введите значения параметровp,q,m');

  65. ReadLn(p,q,m);

  66. Writeln('Введите пределы интегрированияa,b'

  67. +' и точность eps');

  68. ReadLn(a,b,eps);

  69. int1:=Integ(p,q,m,b)-Integ(p,q,m,a);

  70. l:=Trunc(-Log10(eps))+2;

  71. k:=Trunc(Log10(Abs(int1)))+m+3;

  72. Writeln('Значение интеграла по рекурсивной функции ='

  73. ,int1:k:l);

  74. int2:= SimpsonMod(a,b,eps,p,q,m);

  75. Writeln('Значение интеграла по методу Симпсона ='

  76. ,int2:k:l);

  77. ReadLn;

  78. end.