Sine integral (two routines)


#pragma rtGlobals=1		// Use modern global access method.
// Calculate the sine integral based on formulas from Abramowitz and Stegun. 
// See equations 5.2.14 and 5.2.38 and 5.2.39. Si(x)=Integral from 0 to x of sin(x')/x'.
// Peak relative error is approximately 5e-7. This routine is approximately 10x faster 
// than the higher precision routine below.
// Tested using IgorPro 6.02 in a Windows XP box.
// Version 11-30-07-01 C. DeJoseph, Jr.
function Si(xin)
	variable xin

	variable x2,ff,gg,c8,c9,tt,t,i
	variable p2=1.57079632679489
	variable term1,term2
	x2=xin*xin
	if(x2>=3.8) 
		term1=38.102495+x2*(335.677320+x2*(265.187033+x2*(38.027264+x2)))
		term2=xin*(157.105423+x2*(570.236280+x2*(322.624911+x2*(40.021433+x2))))
		ff=term1/term2
		term1=21.821899+x2*(352.018498+x2*(302.757865+x2*(42.242855+x2)))
		term2=x2*(449.690326+x2*(1114.978885+x2*(482.485984+x2*(48.196927+x2))))
		gg=term1/term2
		return p2*sign(xin)-ff*cos(xin)-gg*sin(xin)
	else
		c8=1.
		c9=1.
		tt=xin
		t=0
		i=1
		do
			t=t+tt/(c8*c9)
			tt=-tt*x2
			c8=2.*i+1.
			c9=c9*c8*2.*i
			i+=1
		while(i<7)
		return t
	endif
end
// High precision version of the sine integral based on direct numerical integration
// of the sinc function. Si(x)=Integral from 0 to x of sin(x')/x'. The integration uses 
// gaussian quadrature. Peak relative error is approximately 2e-15 and speed is 
// about 10% of the lower precision routine above.
// Tested using IgorPro 6.02 in a Windows XP box.
// Version 11-30-07-01 C. DeJoseph, Jr.
function Si_hp(xin)
	variable xin
	return integrate1D(specialsinc, 0., xin,2)
end
function specialsinc(xin)
	variable xin
	return sinc(xin)
end

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More