function [s,steps] = TrapezoidalSum(f,h,tol,level,even,varargin) % [s,steps] = TrapezoidalSum(f,h,tol,level,even,varargin) % % applies the truncated trapezoidal rule with sinh-transformation % % f integrand, evaluates as f(t,varargin) % if f=f(t) => call [s,steps] = TrapezoidalSum(f,h,tol,level,even) % h step size % tol truncation tolerance % level number of recursive applications of sinh-transformation % even put 'yes' if integrand is even % varargin additional arguments for f % % s value of the integral % steps number of terms in the truncation trapezoidal rule [sr,kr] = TrapezoidalSum_(f,h,tol,level,varargin{:}); if isequal(even,'yes') sl = sr; kl = kr; else [sl, kl] = TrapezoidalSum_(f,-h,tol,level,varargin{:}); end s = sl+sr; steps = kl+kr+1; return function [s,k] = TrapezoidalSum_(f,h,tol,level,varargin) t = 0; F0 = TransformedF(f,t,level,varargin{:})/2; val = [F0]; F = 1; k = 0; while abs(F) >= tol t = t+h; F = TransformedF(f,t,level,varargin{:}); k = k+1; val = [F val]; end s = abs(h)*sum(val); return function val = TransformedF(f,t,level,varargin) dt = 1; for j=1:level dt = cosh(t)*dt; t = sinh(t); end val = feval(f,t,varargin{:})*dt; return