Mercurial > hg > human-echolocation
view private/EDB1quadstep.m @ 18:2d5f50205527 jabuilder_int tip
Escape the trailing backslash as well
author | Chris Cannam |
---|---|
date | Tue, 30 Sep 2014 16:23:00 +0100 |
parents | 90220f7249fc |
children |
line wrap: on
line source
function Q = EDB1quadstep(a,b,fa,fc,fb,tol,rs,rr,zs,zr,ny,sinnyfivec,cosnyfivec) % EDB1quadstep - Recursive numerical integration routine for EDB1wedge1st_int. % Modified from Matlabs QUADSTEP function. The EDB1quadstep version % solves all time steps at the same time. % % Uses no special function % % ---------------------------------------------------------------------------------------------- % This file is part of the Edge Diffraction Toolbox by Peter Svensson. % % The Edge Diffraction Toolbox is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by the Free Software % Foundation, either version 3 of the License, or (at your option) any later version. % % The Edge Diffraction Toolbox is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS % FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. % % You should have received a copy of the GNU General Public License along with the % Edge Diffraction Toolbox. If not, see <http://www.gnu.org/licenses/>. % ---------------------------------------------------------------------------------------------- % Peter Svensson (svensson@iet.ntnu.no) 20040321 % % EDB1quadstep(a,b,fa,fc,fb,tol,rs,rr,zs,zr,ny,sinnyfivec,cosnyfivec) % Evaluate integrand twice in interior of subinterval [a,b]. c = (a + b)/2; nslots = length(a); % We use the matrix x for both the x-interval values and the corresponding % y-values x = [(a + c)/2, (c + b)/2]; x = reshape(x,2*nslots,1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Instead of using a function call, we plug in the entire function here! %% x = betaoverml_all(x,rs,rr,zr,ny,sinnyfivec,cosnyfivec); ml = sqrt( (x-zs).^2 + rs^2 ).*sqrt( (x-zr).^2 + rr^2 ); %------------------------------------------------ % We would have liked to use the following code: % y = (ml + (zvec-zs).*(zvec-zr))/(rs*rr); % expnyeta = (sqrt(y.^2-1) + y).^ny; % coshnyeta = 0.5*( expnyeta + 1./expnyeta); % but to save three vectors, zvec will be re-used for % y and expnyeta and coshnyeta zvec = (ml + (x-zs).*(x-zr))/(rs*rr); zvec = (real(sqrt(zvec.^2-1)) + zvec).^ny; zvec = 0.5*( zvec + 1./zvec); x = sinnyfivec(1)./(zvec - cosnyfivec(1)); x = x + sinnyfivec(2)./(zvec - cosnyfivec(2)); x = x + sinnyfivec(3)./(zvec - cosnyfivec(3)); x = x + sinnyfivec(4)./(zvec - cosnyfivec(4)); x = x./ml; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% x = reshape(x,nslots,2); fd = x(:,1); fe = x(:,2); ftemp = fa + fb + 2*fc; %----------------------------------------- % We use the output vector Q for another purpose tempvec = (b-a)/6; % Three point Simpson's rule. Q1 = tempvec.*(ftemp + 2*fc); % Five point double Simpson's rule. %Q2 = (h/12).*(fa + 4*fd + 2*fc + 4*fe + fb); % We would have liked to use the following code: % % % Q2 = tempvec/2.*(ftemp + 4*fd + 4*fe); % % % % One step of Romberg extrapolation. % % % Q = Q2 + (Q2 - Q1)/15; % ...... but we save one vector by re-using ftemp % for Q2 ftemp = tempvec/2.*(ftemp + 4*fd + 4*fe); % ftemp = tempvec/2.*(ftemp + 4*x(:,1) + 4*x(:,2)); % One step of Romberg extrapolation. Q = ftemp + (ftemp - Q1)/15; %----------------------------------------- % Check if all or some of the sample intervals % have reached the tolerance. tempvec = find(abs(ftemp-Q)>tol); % Check accuracy of integral over this subinterval. if isempty(tempvec) return % Subdivide into two subintervals. else Qac = EDB1quadstep(a(tempvec),c(tempvec),fa(tempvec),fd(tempvec),fc(tempvec),tol,rs,rr,zs,zr,ny,sinnyfivec,cosnyfivec); Qcb = EDB1quadstep(c(tempvec),b(tempvec),fc(tempvec),fe(tempvec),fb(tempvec),tol,rs,rr,zs,zr,ny,sinnyfivec,cosnyfivec); Q(tempvec) = Qac + Qcb; end