Пример выполнения задания на составление рекурсивной функции
Вычислить значение определенного интеграла, если соответствующий неопределенный интеграл и первообразная функция имеют следующий вид.
Вычисление определённого интеграла произвести двумя способами:1) с использованием приведенных выражений, вычисляемых рекурсивными подпрограммами (точное значение) и 2) с помощью численных методов (приближенно).
В основной программе необходимо осуществить ввод исходных данных – параметров p, q, m, пределов интегрирования a, b и точности ε, с которой будет вычисляться интеграл численными методами. Сравнить полученные результаты.
В рассматриваемой задаче исходный интеграл вычисляется по рекуррентной формуле, причем в этой формуле принимает участие другой интеграл, который также вычисляется по рекуррентной зависимости. Для приближенного вычисления интеграла использован метод парабол, причем в программе для сокращения количества выполняемых операций производится запоминание сумм значений функции, вычисленных на предыдущем шаге вычисления интеграла. Текст программы имеет следующий вид.
// рекурсивный и нерекурсивный варианты вычисления значения определенного // // интеграла
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"
double integ1(double p,double q,int m,double x);
double integ(double p,double q,int m,double x);
double simpsonmod(double a,double b,double eps,double p,double q,int m);
int _tmain(int argc, _TCHAR* argv[])
{ double p,q,a,b,int1,int2,eps;
int m;
printf("wwedite snachenia parametrow p,q,m\n");
|
|
scanf("%lf%lf%d",&p,&q,&m);
printf("\nwwedite predeli integrirowania i tochnost\n");
scanf("%lf%lf%lf",&a,&b,&eps);
int1=integ(p,q,m,b)-integ(p,q,m,a);
printf("\nsnachenie integrala po recursiwnoi funkcii=%8.4f",int1);
int2= simpsonmod(a,b,eps,p,q,m);
printf("\nsnachenie integrala po metodu Simpsona=%8.4f",int2);
getch();
return 0;
}
//Рекурсивная функция вычисления второго интеграла
double integ1(double p,double q,int m,double x)
{ double intg1;
if (m>=2)
intg1=x/(2*(m-1)*pow((p*p-q*q*x*x),m-1))
*p*p
+(2*m-3)/(2*(m-1)*p*p)*integ1(p,q,m-1,x);
else if (m==1)
intg1=log(fabs((p+q*x)/(p-q*x)))/(2*p*q);
return intg1;
}
//Рекурсивная функция исходного интеграла
double integ(double p,double q,int m,double x)
{ double intg;
if (m>=2)
intg=x/(2*(m-1)*q*q*pow((p*p-q*q*x*x),m-1))
-1/(2*(m-1)*q*q)*integ1(p,q,m-1,x);
else if (m==1)
intg=-x/(q*q)+p/(2*q*q*q)
*log(fabs((p+q*x)/(p-q*x)));
return intg;
}
//Функция вычисления интеграла
//по методу парабол (Симпсона)
double simpsonmod(double a,double b,double eps,double p,double q,int m)
{ int n,i;
double x,dx,sch,snch,s1,s2,i1,i2;
n=(b-a)/sqrt(sqrt(eps))+1;
if (n%2==1)n++;
s1=a*a/pow((p*p-q*q*a*a),m);
s2=b*b/pow((p*p-q*q*b*b),m);
sch=0;
snch=0;
dx=(b-a)/n;
for (i=1; i<=n/2; i++)
{
x=a+2*i*dx;
sch+=x*x/pow((p*p-q*q*x*x),m);
x=a+(2*i-1)*dx;
snch+=x*x/pow((p*p-q*q*x*x),m);
}
sch-=s2;
i2=(s1+s2+4*snch+2*sch)*dx/3;
do
{
i1=i2;
n*=2;
dx=(b-a)/n;
sch+=snch;
snch=0;
for (i=1; i<=n/2;i++)
{
x=a+(2*i-1)*dx;
snch+=x*x/pow((p*p-q*q*x*x),m);
}
i2=(s1+s2+4*snch+2*sch)*dx/3;
}
while (fabs(i2-i1)/3>eps);
return i2;
}
Задания для самостоятельной работы
Составить программу для вычисления определенного интеграла с помощью рекурсивной подпрограммы. В основной программе осуществить: ввод исходных данных - пределов интегрирования, параметра n и, в случае необходимости, параметров p (варианты 1-3, 5-8,16, 17, 19, 24-26), a (варианты 13, 14, 16-18), b (вариант 18); вычисление интеграла с помощью подпрограммы; вывод исходных данных и полученного результата с поясняющим текстом. Вычислить интеграл приближенно с точностью ε и сравнить полученные результаты. В заданиях приведены выражения для неопределенных интегралов и первообразных.
|
|
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Дата добавления: 2018-10-27; просмотров: 275; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!