integration_thsh(f,h,npoints,lambda=Pi/2) = {
my(k,exph,eh_inv,res,ekh,ekh_inv,sh,chi,thsh,supres);
exph = exp(h);
eh_inv = 1/exph;
ekh = ekh_inv = 1;
res = f(0);
supres=0;
for(k=1,npoints,
ekh *= exph;
ekh_inv *= eh_inv;
sh = (ekh-ekh_inv)/2;
ch2 = (ekh+ekh_inv);
esh = exp(lambda*sh);
esh_inv = 1/esh;
chsh2_i = 1/(esh+esh_inv);
shsh2 = esh-esh_inv;
thsh = shsh2*chsh2_i;
res += 2*ch2*(f(thsh)+f(-thsh))*chsh2_i^2;
supres=max(abs(res),supres);
);
msgprec(abs(supres*npoints/res));
res *= h*lambda;
return(res);
};
addhelp(integration_thsh,"integration_thsh(f,h,npoints,lambda=Pi/2)");
integration_thsh_until(f,h,D,lambda=Pi/2,moreprec=2) = {
my(k,exph,eh_inv,res,ekh,ekh_inv,sh,chi,thsh,tmp,supres,npoints);
if(!D,D=precision(1.);moreprec=0);
D = (D+moreprec)*log(10);
exph = exp(h);
eh_inv = 1/exph;
ekh = ekh_inv = 1;
res = f(0);
supres=0;
while(1,
ekh *= exph;
ekh_inv *= eh_inv;
sh = (ekh-ekh_inv)/2;
ch2 = (ekh+ekh_inv);
esh = exp(lambda*sh);
esh_inv = 1/esh;
chsh2_i = 1/(esh+esh_inv);
shsh2 = esh-esh_inv;
thsh = shsh2*chsh2_i;
tmp = 2*ch2*(f(thsh)+f(-thsh))*chsh2_i^2;
res+=tmp;
supres=max(abs(res),supres);
if(log(abs(tmp/res))+D+moreprec<0,
npoints = round(log(ekh)/log(exph));
msgpoints(npoints,"thsh");
break());
);
msgprec(abs(supres*npoints/res));
res *= h*lambda;
return(res);
};
Paramètre tau
best_tau_X(Xm,lambda=Pi/2) = {
Xm=abs(Xm);
if(Xm<=1,return(0));
if(!lambda,lambda=Pi/2);
Xtau = atanh(1/Xm);
Ytau = acos(1/Xm);
imag(asinh((Xtau+I*Ytau)/lambda));
};
best_tau_Y(Ym,lambda=Pi/2) = {
Ym=abs(Ym);
if(!Ym,return(0));
if(!lambda,lambda=Pi/2);
Xtau = asinh(1/sqrt(2*Ym));
Ytau = atan(Ym);
imag(asinh((Xtau+I*Ytau)/lambda));
};
tau_point(a,b,z,mu) = {
my(x,y,z,tauX,tauY);
z=(z-(a+b)/2)*2/(b-a);
x = abs(real(z));
y = abs(imag(z));
tauX = best_tau_X((x+mu-1)/mu);
tauY = best_tau_Y(y/mu);
max(tauX,tauY)
};
tau_vecpoints(a,b,V,mu=1.1) = {
my(tau,tauM);
tau=Pi/2;
B = 0;
for(i=1,#V,
tauM = tau_M_point(a,b,V[i],mu);
tau = min(tau,tauM);
);
return(tau);
};
boundX(tau,lambda=Pi/2) = {
my(Xtau,Ytau,dec,ftau,eps,f2);
if(!lambda,lambda=Pi/2);
if(tau>=Pi/2,print("*** error boundX : tau>=Pi/2.");return(0));
if(tau<=0,print("*** error boundX : tau<=0.");return(0));
if(2*lambda*sin(tau)>=Pi,print("*** error boundX :
lambda*sin(tau)>=Pi/2.");return(0));
X1 = 0; Y1 = lambda*sin(tau);
f1 = -cos(Y1);
X2 = sqrt(Pi^2/4-lambda^2*sin(tau)^2)/tan(tau); Y2 = Pi/2;
f2=tanh(X2);
dec=1; eps = 10^(3-default(realprecision));
while(1,
Ytau = (Y1+Y2)/2;
Xtau = sqrt(Ytau^2-lambda^2*sin(tau)^2)/tan(tau);
ftau = tanh(Xtau)-cos(Ytau);
if(abs(ftau)<eps,break(1));
if(ftau<0,Y1=Ytau;f1=ftau,Y2=Ytau;f2=ftau);
);
print([1/tanh(Xtau),tanh(Xtau)/cos(Ytau)^2]);
return(tanh(Xtau)/cos(Ytau)^2);
return(1/tanh(Xtau));
};
addhelp(boundX,"boundX(tau,lambda) : calcule Xmax");
paramètres d'intégration
tau_thsh(Xm,Ym,lambda=Pi/2) = {
if(lambda==0,lambda=Pi/2);
tauX=best_tau_X(Xm,lambda);
tauY=best_tau_Y(Ym,lambda);
min(tauX,tauY);
};
{addhelp(tau_thsh,"tau_thsh(Xmax,Ymax,lambda) : calcule tau
tel que on reste dans le rectangle fixé")};
phi_bound(tau,lambda=Pi/2,alpha=1/2) = {
Ytau = sqrt(Pi/2*lambda*sin(tau));
Xtau = sqrt(Ytau^2-lambda^2*sin(tau)^2)/tan(tau);
return(2*(1+2*alpha)/(2*alpha*cos(Ytau)^(2*alpha))+2/(2*alpha*sinh(Xtau)^(2*alpha)));
};
pas_h_thsh_Xmax(D,tau,M=1,Xmax=3) = {
if(!D,D=default(realprecision)*log(10));
2*Pi*tau/(D+log(16*M*Xmax/cos(tau)+1))
};
addhelp(pas_h_thsh_Xmax,"pas_h_thsh_Xmax(D,tau,M,Xmax)");
pas_h_thsh(D,tau,M=1,alpha=1,lambda=Pi/2) = {
if(!D,D=default(realprecision)*log(10));
return(2*Pi*tau/(D+log(1+M*phi_bound(tau,lambda,alpha))));
};
addhelp(pas_h_thsh,"pas_h_thsh(D,tau,M=1,alpha=1,lambda=Pi/2)");
tmax_thsh(D,M,lambda=Pi/2) = {
if(!D,D=default(realprecision)*log(10));
asinh((D+log(8*M))/lambda)
};
addhelp(tmax_thsh,"tmax_thsh(D,M,lambda)");
integration_segment(f,a=-1,b=1,Xm,Ym,M,lambda=Pi/2,D) = {
my(h,tau,npoints,midpoint,geom_factor);
if(!D,D=default(realprecision)*log(10));
tau = tau_thsh(Xm,Ym,lambda);
h = pas_h_thsh_Xmax(D,tau,M,Xm);
npoints = ceil(tmax_thsh(D,M,lambda)/h);
msgpoints(npoints,"thsh");
midpoint=(a+b)/2; geom_factor=(b-a)/2;
my(g(t)=f(midpoint+t*geom_factor));
geom_factor*integration_thsh(g,h,npoints,lambda)
};
integration_segment_tau(f,a=-1,b=1,tau=Pi/4,M=1,lambda=Pi/2,D) = {
my(h,npoints,midpoint,geom_factor);
if(!D,D=default(realprecision)*log(10));
my(alpha = 1);
if(type(a)==t_VEC,alpha=min(alpha,a[2]);a=a[1]);
if(type(b)==t_VEC,alpha=min(alpha,b[2]);b=b[1]);
h = pas_h_thsh(D,tau,M,alpha,lambda);
npoints = ceil(tmax_thsh(D,M,lambda)/h);
msgpoints(npoints,"thsh");
midpoint=(a+b)/2; geom_factor=(b-a)/2;
my(g(t)=f(midpoint+t*geom_factor));
geom_factor*integration_thsh(g,h,npoints,lambda)
};
addhelp(integration_segment_tau,"integration_segment_tau(f,a,b,tau,M,lambda=Pi/2)");