
- •Численные методы отчет: «Табулирование трансцендентных функций»
- •Доказательство сходимости ряда:
- •2. По полученной таблице значений построить интерполяционный полином Лагранжа, приближающий erf(X)
- •3. На той же сетке узлов построить таблицу приближенных значений , используя составную квадратурную формулу Гаусса с двумя узлами.
- •4. Построить таблицу обратной к функции , решая уравнение следующим итерационным методом: решение уравнения находиться по формуле
- •Листинг программы:
4. Построить таблицу обратной к функции , решая уравнение следующим итерационным методом: решение уравнения находиться по формуле
где
В
качестве начального приближения
к
точке
взять
Получим таблицу:
|
|
|
0 |
0 |
0 |
1 |
0,1 |
0,088438 |
2 |
0,2 |
0,178287 |
3 |
0,3 |
0,271124 |
4 |
0,4 |
0,368906 |
5 |
0,5 |
0,474337 |
6 |
0,6 |
0,591579 |
7 |
0,7 |
0,727922 |
8 |
0,8 |
0,898706 |
9 |
0,9 |
1,148891 |
10 |
1 |
2 |
где - значение переменной, при котором исходная функция принимает значение ,
т.е. erf(zi)=Fi.
.
(1)
Теорема 2. Пусть функция
непрерывна на отрезке
и функция
определена формулой (1). Тогда
имеет производную в любой точке
интервала
,
производную справа в точке x=a
и производную слева в точке x=b,
причём эти производные совпадают со
значением функции
в
соответствующей точке:
при
и
Теорема о существовании и непрерывности обратной функции:
1) Если функция f монотонна на множестве
X и принимает значения на множестве Y
(
),
то на множестве Y определена обратная
функция, принимающая значения в множестве
X и обладающая тем же характером
монотонности, что и сама функция f.
2) Если X=[a,b] и f монотонна и непрерывна на этом множестве, то множество значений функции f есть [f(a),f(b)] и обратная функция непрерывна на нем.
Функция erf(x) удовлетворяет условиям теоремы о существовании и непрерывности обратной функции, отсюда следует, что обратная функция существует и непрерывна.
Рассмотрим нашу функцию
По теореме 2 получаем
.
Соответственно
Листинг программы:
#include <fstream.h>
#include <math.h>
#include <iostream.h>
int fact(int x)
{int k=1;
for(int i=0;i<x;i++)k*=i;
return k;
}
double poly(double X,double x[11], int i, int n)
{double pol=1;
for(int j=0;j<=n;j++)
if(j-i) {pol*=(X-x[j])/(x[i]-x[j]);}
return pol;
}
double func(double x, double h)
{double sum=0;
double e=2.71828183;
double pi=3.14159265;
for(double x1=0;x1<=x;x1+=h) sum+=pow(e,-x1*x1)*h;
sum*=2/sqrt(pi);
return sum;
}
double erf(double x, double e)
{ const double pi=3.1415926535897932384626433832795;
double sum=0;
int n=0;
bool p=1;
double el=2*x/sqrt(pi);
while(p)
{
if (el<e) p=0;
if(n%2) sum-=el; else sum+=el;
n++;
el*=(x*x*(2*n-1))/(n*(2*n+1));
//cout<<el<<'\n';
}
return sum;
}
double sum_Gauss(double c, double d, int N)
{double hn=(d-c)/N;
double sum=0;
for(int i=0;i<N;i++)
{
double z=c+(i-1)*hn;
sum+=(hn/2)*(func(z+(hn/2)*(1-1/sqrt(3)),0.001)+func(z+(hn/2)*(1+1/sqrt(3)),0.001));
}
return sum;
}
double sum_Simpson(double c, double d, int N)
{double hn=(d-c)/N;
double sum=0;
for(int i=0;i<N;i++)
{
double z=c+(i-1)*hn;
sum+=(hn/6)*(func(z,0.001)+4*func((hn)/2,0.001)+func(z+hn,0.001));
}
return sum;
}
double sum_Trap(double c, double d, int N)
{double hn=(d-c)/N;
double sum=0;
for(int i=0;i<N;i++)
{
double z=c+(i-1)*hn;
sum+=(hn/2)*(func(z,0.001)+func(z+hn,0.001));
}
return sum;
}
double sum_Squares(double c, double d, int N)
{double hn=(d-c)/N;
double sum=0;
for(int i=0;i<N;i++)
{
double z=c+(i-1)*hn;
sum+=hn*func(z+z+hn,0.001);
}
return sum;
}
double funcG( double eps,double fi)
{double h1,h2,arg1,arg2,sqr,si,hn,z[160],sum=0,Sum=0,a=0.0; int i=0,f=0,m;
for(m=2;!f;m+=2)
{sum=0;
double pi=3.14159265;
double e=2.71828183;
for(i=1;i<=m;i++)
{hn=(fi-a)/m;
z[i-1]=a+(i-1)*hn;
sqr=1/sqrt(3);
arg1=z[i-1]+(hn/2)*(1-sqr);
arg2=z[i-1]+(hn/2)*(1+sqr);
h1=(2/sqrt(pi))*pow(e,-arg1*arg1);
h2=(2/sqrt(pi))*pow(e,-arg2*arg2);
si=(hn/2)*(h1+h2);
sum+=si;
}
if(fabs(sum-Sum)<=eps) {f=1;break;}
Sum=sum;
}
return Sum;
}
double func1( double eps,double h)
{double erf=0;
const double pi=3.1415926535897932384626433832795;
erf=(2/sqrt(pi))*exp(-h*h);
return erf;
}
double func2( double eps,double h)
{double erf=0;
const double pi=3.1415926535897932384626433832795;
erf=-2*h*(2/sqrt(pi))*exp(-h*h);
return erf;
}
void first_a()
{ofstream fout("table.txt");
const double pi=3.1415926535897932384626433832795;
double x;
int a=0;
int b=2;
double h=0.2;
double e=0.000001;
for(x=a;x<=b;x+=h)
{fout<<x<<" ";
if(int(x)==x) fout<<" ";
fout<<erf(x,e)<<'\n';
}
fout.close();
}
void first_b()
{ofstream fout("table1.txt");
const double pi=3.1415926535897932384626433832795;
double x;
int a=0;
x=a;
int b=2;
double h=0.1;
double e=0.000001;
int i;
for(i=0;i<=10;i++)
{x=(a+b)/2+((b-a)/2)*cos(((2*i-1)*pi)/(2*10));
fout<<x<<" ";
if(int(x)==x) fout<<" ";
fout<<erf(a+h*i,e)<<'\n';
}
fout.close();
}
void second_a()
{ofstream fout("mistake.txt");
ofstream sout("fun.txt");
int a=0;
int b=2;
double h=0.2;
double x[11];
x[0]=a;
double e=0;
int i,n;
int N=10;
for(i=1;i<=10;i++)x[i]=x[i-1]+h;
double L[11];
for(n=0;n<=10;n++)
{
if(n) {L[n]=0; for(i=0;i<=N;i++) L[n]+=erf(x[n],0.000001)*poly(x[n],x,i,N);}
else L[0]=erf(x[0],0.000001)*poly(x[0],x,0,0);
}
for(int j=0;j<=10;j++)
{double fun=erf(x[j],0.000001);
fout<<fabs(erf(x[j],0.000001)-L[j])<<'\n';
if(e<fabs(erf(x[j],0.000001)-L[j])) e=fabs(erf(x[j],0.000001)-L[j]);
sout<<fun<<'\n';
}
cout<<'$'<<e<<'\n';
fout.close();
}
void second_b()
{ofstream ferf("L1.txt");
ofstream fout("mistake1.txt");
ofstream sout("fun1.txt");
ofstream fx("x1.txt");
const double pi=3.1415926535897932384626433832795;
double e=0;
int a=0;
int b=2;
double h=0.2;
int i,n;
double x[21], X[21];
int N=10;
for(i=1;i<=N;i+=1)
{X[i-1]=(a+b)/2+((b-a)/2)*cos(((2*i-1)*pi)/(2*N));
fx<<X[i-1]<<'\n';
};
x[0]=a;
for(i=1;i<=10;i++)
{x[i]=x[i-1]+h;cout<<'#'<<x[i]<<'\n';}
double L[21];
for(n=0;n<=10;n++)
if(n) {L[n]=0; for(i=0;i<=N;i++) L[n]+=erf(a+h*n,0.000001)*poly(x[n],X,i,N);}
else L[0]=erf(a+h*n,0.000001);
for(int j=0;j<=10;j++)
{double fun=erf(x[j],0.000001);
cout<<fun<<'\n';
fout<<fabs(fun-L[j])<<'\n';
if(e<fabs(fun-L[j])) e=fabs(fun-L[j]);
sout<<fun<<'\n';
ferf<<L[j]<<'\n';
}
cout<<'$'<<e<<'\n';
fout.close();
ferf.close();
}
void third_Gauss()
{int N;
ofstream fout("Gauss.txt");
for(double x=0;x<2;x+=0.2)
{N=4;
while(fabs(sum_Gauss(0,x,N)-sum_Gauss(0,x,2*N))>0.0001) {N*=2;cout<<N<<'\n';}
fout<<sum_Gauss(0,x,N)<<' '<<fabs(sum_Gauss(0,x,N)-sum_Gauss(0,x,2*N))<<' '<<N<<'\n';
}
}
void third_Simpson()
{int N;
ofstream fout("Simpson.txt");
for(double x=0;x<2;x+=0.2)
{N=4;
while(fabs(sum_Simpson(0,x,N)-sum_Simpson(0,x,2*N))>0.0001) {N*=2;cout<<N<<'\n';}
fout<<sum_Simpson(0,x,N)<<' '<<fabs(sum_Simpson(0,x,N)-sum_Simpson(0,x,2*N))<<' '<<N<<'\n';
}
}
void third_Trap()
{int N;
ofstream fout("Trap.txt");
for(double x=0;x<2;x+=0.2)
{N=4;
while(fabs(sum_Trap(0,x,N)-sum_Trap(0,x,2*N))>0.0001) {N*=2;cout<<N<<'\n';}
fout<<sum_Trap(0,x,N)<<' '<<sum_Trap(0,x,N)-sum_Trap(0,x,2*N)<<' '<<N<<'\n';
}
}
void third_Squares()
{int N;
ofstream fout("Squares.txt");
for(double x=0;x<2;x+=0.2)
{N=4;
while(fabs(sum_Squares(0,x,N)-sum_Squares(0,x,2*N))>0.0001) {N*=2;cout<<N<<'\n';}
fout<<sum_Squares(0,x,N)<<' '<< fabs(sum_Squares(0,x,N)-sum_Squares(0,x,2*N))<< ' '<<N<<'\n';
}
}
void forth()
{char l[10];
double eps,h[25],z[25],znF,znF1,znF2,J,F[15],pn=0,ps=1,mod=fabs(pn-ps);
int i=0,j=1,k;
ifstream fin ("xi.txt");
ofstream fout ("fg.txt");
while(!fin.eof()){
fin.getline(l,8,' ');
h[i]=atof(l);i++;
}
eps=0.000001;
for(k=0;k<11;k++){
znF=func1(eps,h[k]);
F[k]=func1(eps,h[0])+k*(func1(eps,h[10])-func1(eps,h[0]))/10;
}
z[0]=0;
for(k=0;k<11;k++){j=k;
ps=h[k];
pn=-1;
mod=fabs(pn-ps);
while(mod>eps){
znF=funcG(eps,ps)-F[k];
znF1=func(eps,ps);
znF2=func2(eps,ps);
J=znF2/(2*znF1);
J=J*znF/znF1;
pn=ps-znF*(1+J)/znF1;
mod=fabs(pn-ps);
ps=pn;
}
z[k]=pn;
}
for(k=0;k<11;k++)
cout<<F[k]<<" "<<z[k]<<endl;
}
void main()
{int a=0;
int b=2;
double h=0.2;
double e=0.000001;
first_a();
first_b();
second_a();
second_b();
//third_Gauss();
//third_Simpson();
//third_Trap();
//third_Squares();
//fourth
}