Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 63 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
63
Dung lượng
1,45 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TÍNH TĨAN CÁC MỨC NĂNG LƯỢNG CỦA ĐIỆN TỬ TRONG DÂY LƯỢNG TỬ BẰNG PHƯƠNG PHÁP KHỐI LƯỢNG HIỆU DỤNG VÀ PHƯƠNG PHÁP LIÊN KẾT CHẶT LUẬN VĂN THẠC SĨ Hà Nội- 2006 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CƠNG NGHỆ TINH TĨAN CHẶT CÁC MỨC NĂNG LƯỢNG CỦA ĐIỆN TỬ TRONG DÂY LƯỢNG TỬ BẰNG PHƯƠNG PHÁP KHỐI LƯỢNG HIỆU DỤNG VÀ PHƯƠNG PHÁP LIÊN KẾT CHẶT Luậm Văn Thạch Sỹ : KHOA HỌC Mã số: Người Hướng Dẫn : Hà Nội- 2006 MỤC LỤC Trang Mở đầu…………………… …………………………… Chƣơng CÁC CẤU TRÚC CĨ KÍCH THƢỚC NANƠ.[1,2,3,18] 1.1 Cấu trúc dị thể 1.2 Cấu trúc giới hạn lượng tử 1.3 Mật độ trạng thái .17 Chƣơng TRẠNG THÁI ĐIỆN TỬ TRONG DÂY LƢỢNG TỬ.[4,5,15,16,17] 2.1 Mô hình nghiên cứu 19 2.2 Trạng thái electron dây lượng tử 19 2.3 Phương pháp gần khối lượng hiệu dụng 20 2.4 Hàm sóng lượng electron dây lượng tử 26 2.5 Áp dụng cho toán dây Si trường hợp khối lượng hiệu dụng bất đẳng hướng 30 2.6 Áp dụng tính số 32 Chƣơng PHƢƠNG PHÁP LIÊN KẾT CHẶT [6,14] 3.1 Giới thiệu chung phương pháp liên kết chặt .32 3.2 Nguyên lí chung phương pháp liên kết chặt 34 3.3 Các tham số TB 34 3.4 Xây dựng ma trận Hamilton 35 3.5 Xây dựng tinh thể dây nanô .39 3.6 So sánh kết thảo luận hai phương pháp tính phụ thuộc vào bán kính dây .41 Kết luận…… 43 Phụ lục 44 Phụ lục 51 Tài liệu tham khảo… .60 MỞ ĐẦU I ĐẶT VẤN ĐỀ Công nghệ nanô nghiên cứu ứng dụng vật liệu có cấu trúc nanơ với kích thước 0.1nm-100nm(1nm = 10-9m) Ở kích thước này, vật liệu biểu nhiều hiệu ứng Các hiệu ứng biểu điện tử bị giam giữ cấu trúc có kích thước lượng tử Lý thuyết vật lý lượng tử giải thích hiệu ứng Nhiều ngành khoa học nghiên cứu ứng dụng cấu trúc có kích thước lượng tử: nghiên cứu ứng dụng sản phẩm từ cấu trúc siêu mạng (super lattices), giếng lượng tửquantum wells (QWs), dây lượng tử-quantum wires (QWR) chấm lượng tử-quantum dots (QDs) Trong cấu trúc có kích thước lượng tử, phổ lượng hạt tải trở thành gián đoạn dọc theo hướng toạ độ bị giới hạn, theo hướng không bị giới hạn hạt tải chuyển động hạt tự do, đặc trưng tương tự vật liệu khối, dạng parabolic phổ lượng liên tục với khối lượng hiệu dụng m* Sự biến đổi phổ lượng gây khác biệt đáng kể tất tính chất điện tử hệ so với mẫu khối Việc làm rõ phổ lượng hạt tải dẫn đến tính tốn bước đầu cấu trúc lượng hạt tải Trong luận văn này, tiến hành nghiên cứu tính tốn bước đầu cấu trúc lượng hạt tải phương pháp gần khối lượng hiệu dụng gần liên kết chặt So sánh kết tính hai phương pháp rút ý nghĩa vật lý tính lượng điện tử dây lượng tử II MỤC TIÊU CỦA LUẬN VĂN Tìm hiểu cấu trúc dị thể, giếng lượng tử, dây lượng tử, chấm lượng tử Tìm hiểu phương pháp gần khối lượng hiệu dụng phương pháp gần liên kết chặt Sử dụng phương pháp gần khối lượng hiệu dụng phương pháp gần liên kết chặt để tính lượng electron dây lượng tử Áp dụng tính cho dây Ge, so sánh kết thảo luận hai phương pháp tính phụ thuộc vào đường kính dây III NỘI DUNG CỦA LUẬN VĂN Luận văn bao gồm nội dung sau: Tìm hiểu cấu trúc có kích thước lượng tử: khái niệm, phân loại, phương pháp chế tạo Giới thiệu hai phương pháp thường sử dụng nghiên cứu cấu trúc điện tử vật lí chất rắn: gần liên kết chặt gần khối lượng hiệu dụng So sánh kết rút ý nghĩa vật lý áp dụng hai phương pháp tính lượng điện tử dây lượng tử IV BỐ CỤC CỦA LUẬN VĂN Ngoài phần mở đầu, kết luận phụ lục luận văn trình bày làm ba chương : Chƣơng CÁC CẤU TRÚC CĨ KÍCH THƢỚC NANƠ Trong tơi tìm hiểu cấu trúc dị thể, giếng lượng tử, dây lượng tử, chấm lượng tử Trình bày khái niệm, phân loại, phương pháp chế tạo, ưu nhược điểm phương pháp, tính chất điện tử cấu trúc mật độ trạng thái điện tử cấu trúc Chƣơng TRẠNG THÁI CỦA ELECTRON TRONG DÂY LƢỢNG TỬ Trình bày phương pháp gần khối lượng hiệu dụng áp dụng cho tính hàm sóng lượng electron dây lượng tử Tính mức lượng gián đoạn electron cho dây Ge Chƣơng PHƢƠNG PHÁP LIÊN KẾT CHẶT Trình bày phương pháp liên kết chặt -Tight-Binding(TB) áp dụng cho tính hàm sóng lượng electron dây Ge Cuối so sánh kết luận chúng tơi đánh giá kết thu được, hạn chế hướng phát triển tiếp Chƣơng CÁC CẤU TRÚC CĨ KÍCH THƢỚC NANÔ 1.1 Cấu trúc dị thể Chúng ta biết vật liệu bán dẫn tồn vùng lượng Vùng bị lấp đầy electron gọi hóa trị Vùng tham gia vào trình dẫn trạng thái trống hay cịn gọi lỗ trống Thơng thường, lỗ trống chiếm mức lượng cao (đỉnh) vùng hóa trị [1] Vùng lượng cao hơn, khơng bị chiếm đóng electron gọi vùng dẫn Các electron chiếm trạng thái vùng bị kích thích để khỏi mối liên kết cộng hóa trị chuyển động tinh thể Các electron bị gia tốc điện trường tham gia vào trình dẫn điện Đỉnh vùng hóa trị đáy vùng dẫn cách khoảng gọi vùng cấm với ý nghĩa khơng có giá trị lượng phép electron nằm vùng Khi hai bán dẫn độ rộng vùng cấm khác đưa lại tiếp xúc với ta có tiếp xúc dị chất Các bán dẫn có số mạng tương hợp làm giảm mật độ trạng thái bề mặt xuống tới 108cm-2, đối xứng tinh thể tương tự Cấu trúc dị thể phổ biến thường chế tạo từ GaAs-AlGaAs, lớp GaAs có độ rộng vùng cấm hẹp lớp AlGaAs có độ rộng vùng cấm rộng Mơ hình cấu trúc dị thể mơ tả hình1.1a EF AlGaAs AlGaAs GaAs (a) Sơ đồ vùng: GaAs (b) Hình 1.1 Cấu trúc dị thể EF Khi hai lớp bán bán dẫn tiếp xúc mà điện tích chưa dịch chuyển, mức Fermi cấu trúc dị thể có dạng hình 1.1b Sau điện tử chuyển từ AlGaAs sang GaAs, mức Fecmi toàn cấu trúc E g1 C1 Ev Eg C2 Khí điện tử hai chiều Ec mơ tả hình 1.2 EF Hình 1.2 Giản đồ vùng lượng tiếp xúc dị chất đơn Trong đó: Eg1, Eg2 độ rộng vùng cấm chất bán dẫn; Ec Ev bước chuyển đột ngột vùng lượng; Ec độ dịch đáy vùng dẫn-conducting band offset; Ev độ dịch đỉnh vùng hoá trị-valance band offset Độ dịch vùng dẫn Ec xác định hiệu cơng điện tử vật liệu tham gia tiếp xúc: Ec = C2 – C1 độ rộng vùng hoá trị Ev = Eg1 – Eg2 - Ec Ưu điểm tiếp xúc dị chất so với cấu trúc khác thể chất lượng tốt hẳn mặt phân cách dị chất hai bán dẫn Phân loại cấu trúc dị thể thành bốn loại theo mối quan hệ vị trí cực trị vùng vùng dẫn vùng hố trị mơ tả hình 1.3 Hình 1.3 Phân loại cấu trúc dị thể Loại I (hình1.3a): điện tử lỗ trống bị giam nhốt bán dẫn có vùng cấm nhỏ hơn, loại tạo GaAs/AlGaAs, GaSb/AlSb, GaAs/ GaP, vài vật liệu khác Loại II (hình1.3b): lỗ trống bị giam nhốt lớp bán dẫn, điện tử bị giam nhốt lớp bán dẫn lại, loại thường tạo InP/Al0.48 In0.52P Loại III (hình 1.3c): có độ dịch vùng nhau, độ lớn độ dịch lớn đến mức khe hai vật liệu không chập Loại đơi cịn biết đến giống loại hai với điều kiện khe không chập nhau, có khác biệt hai loại mức cân Fecmi hai vật liệu dẫn đến độ cong vùng lớn, hình thành điện tử lỗ trốn hai lớp bán dẫn Loại thường tạo InAs/GaSb Loại IV (hình1.3d): cấu trúc đảo vùng, cực trị vùng hai mặt đối diện thay đổi đối xứng Các cấu trúc loại thường tạo HgTe/CdTe [2] Các cấu trúc dị thể ứng dụng kỹ thuật điện tử, lưu trữ thông tin, hấp thụ Các phương pháp thường áp dụng để chế tạo cấu trúc phương pháp phún xạ catốt, phương pháp bốc bay nhiệt phương pháp epitaxy chùm phân tử Việc chế tạo cấu trúc dị thể cần phải chọn đôi bán dẫn, hợp kim kim loại khác cho chúng cho chất lượng bề mặt tiếp xúc tốt, lựa chọn số mạng tinh thể độ sai khác cỡ phần nghìn đến phần trăm, nhằm dẫn đến mật độ sai hỏng xếp sai khác số mạng gần mặt phân cách thấp Chế tạo cấu trúc dị thể phương pháp phún xạ catốt-cathod sputtering: Phương pháp chế tạo thực mơi trường khí Ar, áp suất cỡ 10-2 Torr nhiệt độ phòng Sử dụng số thành phần bia khác Si(100), Al2O3 , công suất phát rf 300W, mật độ công suất 24W/ cm2 tốc độ tạo màng cỡ A0/s Ưu điểm, phương pháp thực nhiệt độ phòng, áp suất thấp dễ thực hiện, không phụ thuộc vào nhiệt độ nóng chảy thành phần chất bia Nhược điểm, việc tạo cấu trúc khó điều khiển theo mong muốn, cần lựa chọn vật liệu có hệ số khuếch tán thấp Cấu trúc dị thể chế tạo phương pháp bốc bay nhiệt chân không: Phương pháp địi hỏi chân khơng cần đạt tới 10-6Torr, thuyền bốc bay chịu nhiệt độ cao wolfram, vật liệu bốc bay dạng bột với thành phần bốc bay tuỳ theo mục đích chế tạo Trước bốc bay đế làm bắn phá ion Ar với áp suất 10-2Torr dịng phóng cỡ ampe vài phút Tốc độ bốc bay khoảng A0/s Ưu điểm phương pháp tạo cấu trúc dị thể tốt Nhược điểm, áp suất thấp nhiệt độ bay chất rắn giảm, áp suất cao gây áp suất cục chênh lệch nhiệt độ bay chất tạo cấu trúc dị thể ảnh hưởng đến bay chất có nhiệt độ bay cao Hiện công nghệ phổ biến để chế tạo cấu trúc dị thể phương pháp epitaxy chùm phân tử-Molecular beam epitaxy(MBE) Trong phương pháp này, dòng nguyên tử (phân tử) chất tạo cấu trúc dị thể Si, Al, Ga, As điều khiển từ nguồn riêng biệt điều kiện chân không cao cỡ 10-9mmHg->10-10mmHg hướng thẳng vào đế, nơi chúng kết tinh lại tạo thành màng Chiều dày, thành phần chất cấu trúc dị thể điều khiển che dùng để ngăn chặn dòng dòng khác chất tạo cấu trúc Việc điều khiển thành phần mức độ hoàn thiện tinh thể lớp thực trực tiếp nhờ phổ kế Auger nhiễu xạ điện tử suốt q trình ni cấy Ưu điểm phương pháp này: Điều khiển 47 integer :: idir integer :: ilh0 integer :: nwfn integer :: ierr integer :: idx, jdx integer :: ival, nval integer :: ikpt, nkpt integer :: ixc, iyc, izc integer :: ixp, iyp, izp integer, allocatable :: nbtyp(:) integer, allocatable :: nvalk(:), idirk(:) logical :: todo, found real(dp) :: ek,ek1,ek2 real(dp) :: vso2 real(dp) :: sigma real(dp) :: x, y, z real(dp) :: radius, radiuseff real(dp) :: kred, dkred, kred1, kred2, kred3 real(dp) :: vbmax, kvbmax, cbmin, kcbmin, eg real(dp) :: k(3) real(dp), allocatable :: kpt(:) real(dp), allocatable :: sigmak(:) real(dp), allocatable :: eval(:,:) complex(dp), allocatable :: evec(:,:) character(len = 7) :: nbtypstr character(len = 80) :: id character(len = 80) :: paramTBfile character(len = 10), allocatable :: optk(:) ! Main code call startglobaltimer ! Set parameters for the calculation anioncentered = true removeXH3 = true withSO = true ! Read the input file open (untfree, file = 'wireZB.input', form = 'formatted', status = 'old') ! Read the radius of the nanowire and the orientation vector read (untfree, '(/9x,f10.5,/27x,sp,3(i2),ss)') radius, ixc, iyc, izc write (stdout, '( "Homogeneous ZB nanowire.", & & /"Radius = ",f10.5," nm.", & & /"Orientation (cubic axes) : ",sp,3(i2),ss,".")') radius, ixc, iyc, izc write (id, '(sp,3(i2),ss,"_")') ixc, iyc, izc ! The ID of the nanowire ! Transform the orientation vector from cubic to primitive axes ixp = -ixc+iyc+izc iyp = ixc-iyc+izc izp = ixc+iyc-izc ! Try to skrink the unit cell found = true while (found) found = false i = 2, maxval((/ixp,iyp,izp/)) if ((mod(ixp, i) == 0).and.(mod(iyp, i) == 0).and.(mod(izp, i) == 0)) then ixp = ixp/i iyp = iyp/i izp = izp/i 48 found = true exit endif enddo enddo ! Transform the orientation vector back to the cubic axes x = (iyp+izp)/2.d0 y = (ixp+izp)/2.d0 z = (ixp+iyp)/2.d0 write (stdout, '("Primitive cell vector (cubic axes) : (",sp,f5.2,", ",f5.2,", ",f5.2,ss,").")') & & x, y, z uwire = (/x, y, z/) ! Read the TB model and parameters file read (untfree, '(21x,a80)') paramTBfile write (stdout, '("TB parameters file : ",a,".")') trim(paramTBfile) ! Read the number and list of k-points read (untfree, '(21x,i3)') nkpt write (stdout, '("Number of k points = ",i3,".")') nkpt allocate(kpt(nkpt), sigmak(nkpt), idirk(nkpt), nvalk(nkpt), optk(nkpt)) read (untfree,'(/)') write (stdout, '(a,/a)') "List of k points :", & & " k (2pi/a) # sigma (eV) # dir # nval # options" ikpt = 1, nkpt read (untfree, '(f10.5,3x,f10.5,3x,i3,3x,i4,2x,a10)') & & kpt(ikpt), sigmak(ikpt), idirk(ikpt), nvalk(ikpt), optk(ikpt) write (stdout, '(f10.5," # ",f10.5," # ",sp,i3,ss," # ",i4," # ",a10)') & & kpt(ikpt), sigmak(ikpt), idirk(ikpt), nvalk(ikpt), optk(ikpt) enddo close (untfree) ! Read the tight-binding parameters write (stdout, *) dbg_hamilt = call readparams_sp3d5t_2c(paramTBfile) norbs = norbs_sp3d5t range = range_sp3d5t acell = readacell(paramTBfile, 'acell = ') if (acell 0).and.(scan(optk(ikpt), "-") == 0)).or.(scan(optk(ikpt), "Ee") /= 0) if (.not.todo) cycle k = twopi*kred*uwire/lwire write (stdout, '(/"ikpt = ",i2," : k = ",f10.5," ; sigma = ",f10.5," ; idir = ",sp,i3,ss," ; nval = ",i4,".")') & & ikpt, kred, sigma, idir, nval write (stdout, '(75("*"))') ! Compute the hamiltonian and JD preconditioner write (stdout, *) 50 call zdhamilt_sp3d5t_2c(k, true., h, dpos, ityp, neighborhood, nbsc, nbhy, nper, ntot) write (stdout, *) call zdbondprecdt_sp3xx(k, 0.d0, true., hp, dpos, ityp, neighborhood%neighbors(1)%ineigh, & & nbsc, nbhy, nper, ntot, norbs, esh, esp3, bsp3, e0) ! Check the hermiticity of the hamiltonian and JD preconditioner if (.not.zchecksymmetry_sparse(1.d-6, h%aij, h%jmax, h%icol, ndim)) & & stop "Error, hamiltonian is not hermitian." if (.not.zchecksymmetry_sparse(1.d-6, hp%aij, hp%jmax, hp%icol, ndim)) & & stop "Error, bond preconditioner is not hermitian." ! Compute the wavefunctions if ((nval > 0).and.(scan(optk(ikpt), "-") == 0)) then ! Allocate memory for the wavefunctions allocate(eval(2,nval), evec(ndimeff,nval)) ival = 1, nval call zrand(evec(1,ival), ndimeff) call znormalize(evec(1,ival), ndimeff) enddo ! dbg_jdeig = write (stdout, *) call zjdeigin_ortho_sym(ndimeff, prodhv, solve, nodegeneracy, & & sigma, idir, epsilon_JD, & & itnew_JD, itmax_JD, nkeep_JD, & & nval, eval, ndimeff, evec, & & ierr) if (ierr /= 0) & & write (stdout, '(/"Warning, JD failed and returned ierr = ",i3, & & " (",i4," wavefunctions were computed).")') ierr, nval ! Compute the conduction band minium and the valence band maximum if (idir < 0) then if (eval(1,1) > vbmax) then vbmax = eval(1,1) kvbmax = kred endif else if (eval(1,1) < cbmin) then cbmin = eval(1,1) kcbmin = kred endif endif ! Analyze the wavefunctions write (stdout, '(/"Results for ikpt = ",i2," : k = ",f10.5,".")') ikpt, kred call zanalyzewfn_ortho(nval, ndim, 2*ndimeff/ndim, eval, evec, nper, ityp) ! Write the wavefunctions to disk idx = scan(optk(ikpt), "Ss") if (idx /= 0) then jdx = idx, len_trim(optk(ikpt))-1 if (scan(optk(ikpt)(jdx+1:jdx+1), "0123456789") == 0) exit enddo if (jdx > idx) then read (optk(ikpt)(idx+1:jdx), *) nwfn else 51 nwfn = nval endif nwfn = min(nwfn, nval) call zwritewfnblock('wireZB_'//trim(id)//'.out', nwfn, ndim, 2*ndimeff/ndim, k, eval, evec) endif ! Write the band structure to disk open (untfree, file = 'wireZB_'//trim(id)//'.bs', form = 'formatted', position = 'append') ival = 1, nval write (untfree, '(f10.5,1x,f10.5)') kred, eval(1, ival) enddo close (untfree) endif ! Free memory call free_zdsparsematrix(h) if (precdt_bandext) call free_zdsparsematrix(hp) ! Search for band extremum, if appropriate idx = scan(optk(ikpt), "Ee") if (idx /= 0) then read (optk(ikpt)(idx+1:),'(1x,f4.2,1x)') dkred idir_bandext = idir sigma_bandext = sigma kred1 = kred-dkred kred2 = kred kred3 = kred+dkred write (stdout, '(/"Looking for band extremum in [",f10.5,",",f10.5,"].")') kred1, kred3 if (nval > 0) then allocate(evec_bandext(ndimeff,nval_bandext)) call zcopy(evec(1,1), evec_bandext(1,1), ndimeff) endif call brent(kred1, kred2, kred3, bandenergy, epsilon_kred, kred, ek, ierr) if (ierr /= 0) then write (stdout, '("Error, brent failed and returned ierr = ",i3,".")') ierr ! stop "Error, brent failed." if (ierr == 1) then ek1=bandenergy(kred1) ek2=bandenergy(kred2) if (ek1 < ek2)then kred=kred1 ek=ek1 else kred=kred3 ek=bandenergy(kred) endif endif endif ek = ek*idir_bandext write (stdout, '("Found band extremum E = ",f10.5," eV @ k = ",f10.5,".")') ek, kred open (untfree, file = ' / /CBM_D.dat', form = 'formatted', position = 'append') write (untfree, '(f6.2,3(f10.5,1x),i5)')radius*2.0, radiuseff*2.0, ek, kred, ierr close (untfree) 52 if (idir < 0) then if (ek > vbmax) then vbmax = ek kvbmax = kred endif else if (ek < cbmin) then cbmin = ek kcbmin = kred endif endif deallocate(evec_bandext) endif ! Free memory deallocate(eval, evec) if (.not.precdt_bandext) call free_zdsparsematrix(hp) enddo ! Write the bandgap energy to disk eg = cbmin-vbmax write (stdout,'(/"Effective nanowire radius = ",f10.5," nm.", & & /"Valence band maximum = ",f10.5," eV @ k = ",f10.5,".", & & /"Conduction band minimum = ",f10.5," eV @ k = ",f10.5,".", & & /"Bandgap energy = ",f10.5," eV.")') & & radiuseff, vbmax, kvbmax, cbmin, kcbmin, eg open (untfree, file = ' / /wireZB.eg', form = 'formatted', position = 'append') write (untfree, '(f6.2,i6,1x,i6,1x,6(f10.5,1x),a)')radius*2.0, nbsc, nbhy, radiuseff, vbmax, kvbmax, cbmin, kcbmin, eg, trim(id) close (untfree) ! Free memory deallocate(ipos, dpos) deallocate(ityp, nbtyp) deallocate(kpt, sigmak, idirk, nvalk, optk) call free_neighborhood(neighborhood) call freeparams_sp3d5t_2c ! Print timing statistics write (stdout, *) call stopglobaltimer call printtimeslot("geometry", timer_geometry) call printtimeslot("hamilt", timer_hamilt) call printtimeslot("precdt", timer_preconditioners) call printtimeslot("jdeig", timer_jdeig) call printtimeslot(" incl sparsematrix", timer_sparsematrix) end program wireZB Phụ lục Chương trình máy tính sử dụng phương pháp EMA (chương trình chính) Ngơn ngữ lập trình: Pascal Program CTchinh; uses crt; const ms=8.33742E-31; 53 mv=1.73355E-31; h=6.625E-34; v0=20E-19; s=34; Label 100; Label 101; Label 102; Var c0,d0,gd0,gc0,delta0,R0:double; i0,j0,k0,l,n,i,m,m0,j00:integer; c1,d1,gd1,gc1,delta1,R1:double; i1,j1,k1,m1,j11:integer; c2,d2,gd2,gc2,delta2,R2S:double; i2,j2,k2,m2,j22,sbn:integer; F0,F1,F2:text; a,b,eps:double; key:char; cn:boolean; q0:array[1 400] of double; q1:array[1 400] of double; q2:array[1 400] of double; {Ham Bessel I0} FUNCTION bessi0(x: double): double; VAR ax: double; y,ans: double; BEGIN IF abs(x) < 3.75 THEN BEGIN y := sqr(x/3.75); ans := 1.0+y*(3.5156229+y*(3.0899424+y*(1.2067492+y* (0.2659732+y*(0.360768e-1+y*0.45813e-2))))) END ELSE BEGIN ax := abs(x); y := 3.75/ax; ans := (exp(ax)/sqrt(ax))*(0.39894228+y*(0.01328592+y*(0.00225319 +y*(-0.00157565+y*(0.00916281+y*(-0.02057706 +y*(0.02635537+y*(-0.01647633+y*0.00392377)))))))) END; bessi0 := ans; END; {Bessel I1} FUNCTION bessi1(x: double): double; VAR ax: double; y,ans: double; BEGIN IF abs(x) < 3.75 THEN BEGIN y := sqr(x/3.75); ans := x*(0.5+y*(0.87890594+y*(0.51498869+y*(0.15084934 +y*(0.2658733e-1+y*(0.301532e-2+y*0.32411e-3)))))) END ELSE BEGIN ax := abs(x); y := 3.75/ax; ans := 0.2282967e-1+y*(-0.2895312e-1+y*(0.1787654e-1-y*0.420059e2)); ans := 0.39894228+y*(-0.3988024e-1+y*(-0.362018e-2 +y*(0.163801e-2+y*(-0.1031555e-1+y*ans)))); 54 ans := (exp(ax)/sqrt(ax))*ans; IF x < 0.0 THEN ans := -ans END; bessi1 := ans END; {Ham Bess K0} FUNCTION bessk0(x: double): double; VAR y,ans: double; BEGIN IF x