require 'narray' require 'pgplot' include Pgplot include NMath PI = Math::PI TWOPI = PI*2 BLACK,WHITE,RED,GREEN,BLUE,CYAN,MAGENT,YELLOW = (0..7).to_a FULL,DASH,DOTDSH,DOTTED,FANCY = (1..5).to_a NORMAL,ROMAN,ITALIC,SCRIPT = (1..4).to_a SOLID,HOLLOW = (1..2).to_a # ====== Utility function ====== def indgen arg if arg.kind_of?(Range) return NArray.sfloat(arg.size).indgen!(arg.first) elsif arg.kind_of?(Numeric) return NArray.sfloat(arg).indgen! else raise ArgumentError, "invalid argument" end end def randomn n=1 rr = NArray.sfloat(n) xx = NArray.sfloat(n) idx= NArray.int(n).indgen! i = 0 while i0 then xo3 = x[idx1]/3.0 t = xo3**2 r[idx1] = 1.0 + t*(-2.2499997 + t*( 1.2656208 + t*(-0.3163866 + t*( 0.0444479 + t*(-0.0039444 + t*( 0.0002100)))))) end if idx2.size>0 then xx = x[idx2] t = 3.0/xx f0 = 0.79788456 + t*(-0.00000077 + t*(-0.00552740 + t*(-0.00009512 + t*( 0.00137237 + t*(-0.00072805 + t*( 0.00014476)))))) theta0 = xx - 0.78539816 + t*(-0.04166397 + t*(-0.00003954 + t*( 0.00262573 + t*(-0.00054125 + t*(-0.00029333 + t*( 0.00013558)))))) r[idx2] = f0*cos(theta0)/sqrt(xx) end return r end def bessel_j1 arg r = NArray.sfloat(arg.size) x = arg.abs idx1,idx2 = (x<=3).where2 if idx1.size>0 then xo3 = x[idx1]/3.0 t = xo3**2 f = 0.5 + t*(-0.56249985 + t*( 0.21093573 + t*(-0.03954289 + t*( 0.00443319 + t*(-0.00031761 + t*( 0.00001109)))))) r[idx1] = f * arg[idx1] end if idx2.size>0 then xx = x[idx2] t = 3.0/xx f1 = 0.79788456 + t*( 0.00000156 + t*( 0.01659667 + t*( 0.00017105 + t*(-0.00249511 + t*( 0.00113653 + t*(-0.00020033)))))) theta1 = xx - 2.35619449 + t*( 0.12499612 + t*( 0.00005650 + t*(-0.00637879 + t*( 0.00074348 + t*( 0.00079824 + t*(-0.00029166)))))) r[idx2] = f1*cos(theta1)/sqrt(xx) end idx = (arg<0).where #p idx #p r[idx] r[idx] = -r[idx] if idx.size>0 return r end def pgex10 pgbbuf pgsave pgsci(YELLOW) # PGFUNX(PGBSJ0,500,0.0,10.0*PI,0) x = indgen(500)/50*PI y = bessel_j0(x) pgenv 0,PI*10, y.min,y.max pgline x,y pgsci(RED) pgsls(DASH) # PGFUNX(PGBSJ1,500,0.0,10.0*PI,1) pgline x, bessel_j1(x) pgsci(GREEN) pgsls(FULL) pglab('\fix', '\fiy', '\frPGPLOT Example 10: routine PGFUNX') pgmtxt('T', -4.0, 0.5, 0.5, '\frBessel Functions') pgarro(8.0, 0.7, 1.0, bessel_j0(NArray[1.0])[0]) pgarro(12.0, 0.5, 9.0, bessel_j1(NArray[9.0])[0]) pgstbg(GREEN) pgsci(0) pgptxt(8.0, 0.7, 0.0, 0.0, ' \fiy = J\d0\u(x)') pgptxt(12.0, 0.5, 0.0, 0.0, ' \fiy = J\d1\u(x)') pgunsa pgebuf end # ====== Demo start ====== raise "device not found" if pgopen<0 pgex0 pgex1 pgex2 pgex3 pgsubp 2,1 pgex4 pgex5 pgsubp 1,1 pgex6 pgex7 pgex8 pgex9 pgex10 pgclos exit