Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы 1 - 10 / lr_7 / LR_7
.CPP#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define _n0 4
#define _a M_PI_4
#define _b M_PI_2
double F(double x);
double rectang(double a, double b, int n);
double trapec(double a, double b, int n);
double simpson(double a, double b, int n);
void runge_rect(double eps, FILE *f_out);
void runge_trap(double eps, FILE *f_out);
void runge_simp(double eps, FILE *f_out);
//*************************************************
void main()
{
double eps;
int i;
//*************************************************
FILE *f_out1, *f_out2, *f_out3;
if ((f_out1 = fopen("out1.txt","w")) == NULL)
{
fprintf(stderr, "\nCan't open out1.txt\n");
exit(1);
}
if ((f_out2 = fopen("out2.txt","w")) == NULL)
{
fprintf(stderr, "\nCan't open out2.txt\n");
exit(1);
}
if ((f_out3 = fopen("out3.txt","w")) == NULL)
{
fprintf(stderr, "\nCan't open out3.txt\n");
exit(1);
}
//*************************************************
clrscr();
eps = 0.01;
for (i=0; i<3; i++)
{
runge_rect(eps,f_out1);
runge_trap(eps,f_out2);
runge_simp(eps,f_out3);
eps /= 10;
}
fclose(f_out1);
fclose(f_out2);
fclose(f_out3);
return;
}
//*************************************************
//*************************************************
double F(double x)
{
return log(sin(x));
}
//*************************************************
//*************************************************
double rectang(double a, double b, int n)
{
double integral = 0,
h = (b-a)/n,
x=a;
int i;
if (n%2>0)
{
fprintf(stderr, "\nWrong n value!\n");
exit(1);
}
x = a + h/2;
for (i=0; i<n; i++)
{
integral += F(x);
x += h;
}
integral *= h;
return integral;
}
//*************************************************
//*************************************************
double trapec(double a, double b, int n)
{
double integral = 0,
h = (b-a)/n,
xi,xi1;
int i;
if (n%2>0)
{
fprintf(stderr, "\nWrong n value!\n");
exit(1);
}
xi = a;
xi1 = a + h;
for (i=0; i<n; i++)
{
integral += F(xi) + F(xi1);
xi = xi1;
xi1 += h;
}
integral *= h/2;
return integral;
}
//*************************************************
//*************************************************
double simpson(double a, double b, int n)
{
double integral = 0,
h = (b-a)/n,
x=a;
int i;
if (n%2>0)
{
fprintf(stderr, "\nWrong n value!\n");
exit(1);
}
x = a;
for (i=0; i<n/2-1; i++)
{
integral += F(x);
x += h;
integral += 4*F(x);
x += h;
integral += F(x);
}
integral *= h/3;
return integral;
}
//*************************************************
//*************************************************
void runge_rect(double eps, FILE *f_out)
{
int n=_n0, n_2 = _n0/2, i;
double pogr;
double I_n,I_n_2;
fprintf(f_out,"\n\n************ Rectangle *****************\n");
fprintf(f_out,"Eps = %.4f\n",eps);
fprintf(f_out,"N\tI(n)\t\tI(n/2)\t\t|I(n)-I(n/2)|/3\n");
pogr = eps*2;
I_n_2 = rectang(_a,_b,n_2);
for (i=0; (i<100) && (pogr>eps); i++)
{
I_n = rectang(_a,_b,n);
pogr = fabs(I_n-I_n_2)/3;
fprintf(f_out, "%d\t% -.6f\t% -.6f\t% -.6f\n",n,I_n,I_n_2,pogr);
n_2 = n;
n *= 2;
I_n_2 = I_n;
}
return;
}
//*************************************************
//*************************************************
void runge_trap(double eps, FILE *f_out)
{
int n=_n0, n_2 = _n0/2, i;
double pogr;
double I_n,I_n_2;
fprintf(f_out,"\n\n************** Trapec ******************\n");
fprintf(f_out,"Eps = %.4f\n",eps);
fprintf(f_out,"N\tI(n)\t\tI(n/2)\t\t|I(n)-I(n/2)|/3\n");
pogr = eps*2;
I_n_2 = trapec(_a,_b,n_2);
for (i=0; (i<100) && (pogr>eps); i++)
{
I_n = trapec(_a,_b,n);
pogr = fabs(I_n-I_n_2)/3;
fprintf(f_out, "%d\t% -.6f\t% -.6f\t% -.6f\n",n,I_n,I_n_2,pogr);
n_2 = n;
n *= 2;
I_n_2 = I_n;
}
return;
}
//*************************************************
//*************************************************
void runge_simp(double eps, FILE *f_out)
{
int n=_n0, n_2 = _n0/2, i;
double pogr;
double I_n,I_n_2;
fprintf(f_out,"\n\n************** Simpson *****************\n");
fprintf(f_out,"Eps = %.4f\n",eps);
fprintf(f_out,"N\tI(n)\t\tI(n/2)\t\t|I(n)-I(n/2)|/15\n");
pogr = eps*2;
I_n_2 = simpson(_a,_b,n_2);
for (i=0; (i<100) && (pogr>eps); i++)
{
I_n = simpson(_a,_b,n);
pogr = fabs(I_n-I_n_2)/15;
fprintf(f_out, "%d\t% -.6f\t% -.6f\t% -.6f\n",n,I_n,I_n_2,pogr);
n_2 = n;
n *= 2;
I_n_2 = I_n;
}
return;
}
//*************************************************