Contents
Kidger triplet
rd = [ 0 18.609 460.967 -29.934 18.605 0 67.594 -22.162 0]; th = [ 0 2.5 5.157 1 1.207 4.007 2.5 41.60525 0]; rn = [ 1 1.620408 1 1.636355 1 1 1.620408 1 1]; sa = [ 0 7 7 5.1 5.1 5 6.2 6.2 0]; gn = char('SK16','F6','SK16'); ast = 6; pya = [50/8 0]; pyc = [-5.12787 tan(22*pi/180)]; load ZEMAX
This is the paraxial raytrace from Kidger. The setting allows the real chief ray to pass through the center of the pupil.
cv = curvature(rd); pya = parax(pya,cv,th,rn); pyc = parax(pyc,cv,th,rn); [pya pyc]
ans =
6.2500 0 -5.1279 0.4040
6.2500 -0.1286 -5.1279 0.3548
5.9285 -0.2004 -4.2408 0.5693
4.8951 -0.0589 -1.3050 0.3309
4.8362 0.0691 -0.9741 0.5082
4.9196 0.0691 -0.3606 0.5082
5.1965 0.0132 1.6758 0.3041
5.2295 -0.1250 2.4361 0.4246
0.0287 -0.1250 20.1034 0.4246
This paraxial raytrace sets the stop per the lens drawing/specifications
k = -pyc(ast,1)/pya(ast,1) pyc = pyc + k*pya; [pya pyc]
k =
0.0733
ans =
6.2500 0 -4.6697 0.4040
6.2500 -0.1286 -4.6697 0.3454
5.9285 -0.2004 -3.8062 0.5546
4.8951 -0.0589 -0.9462 0.3266
4.8362 0.0691 -0.6195 0.5133
4.9196 0.0691 0 0.5133
5.1965 0.0132 2.0567 0.3051
5.2295 -0.1250 2.8195 0.4155
0.0287 -0.1250 20.1055 0.4155
exercise 1
trig_ray(pya(1),0,cv,th,rn); [Y U] = trig_ray(pya(1),0,cv,th,rn); fprintf('marginal ray error %g mm\n',Y); fprintf('marginal focus %g mm\n',-Y/tan(U));
1 6.25000 0.00000 2 6.05374 -0.13374 3 5.05800 -0.20934 4 4.93547 -0.05837 5 4.97870 0.07982 6 5.31597 0.07982 7 5.34683 0.01886 8 -0.00202 -0.12590 marginal ray error -0.00201824 mm marginal focus -0.0159456 mm
exercise 2
Seidel wavefront coefficients
lambda = 0.58756e-3; ford(pya, pyc, cv, th, rn, lambda);
L =
2.5252
W =
0 0 0 0 0
11.9025 21.7012 9.8917 60.7667 55.3965
5.3684 -62.5597 182.2553 88.8742 -517.8351
-22.6766 146.1077 -235.3472 -152.9207 492.6427
-11.7029 -68.2875 -99.6162 -106.5180 -310.7718
0 0 0 0 0
1.4354 21.3874 79.6660 55.2008 411.2352
19.3016 -61.6536 49.2338 71.4887 -114.1754
3.6285 -3.3044 -13.9165 16.8916 16.4921
W040 W131 W222 W220 W311
3.63 -3.30 -13.92 16.89 16.49
ZEMAX results
W040 W131 W222 W220P W311 W020 W111 TOT 3.6283 -3.3042 -13.9164 23.8497 16.4921 -0.0528 0.1490
W220S W220M W220T TOT 16.8915 9.9333 2.9751
exercise 3
y = linspace(0,1,51);
% function Y = trig_ray(Qin,Uin,cv,th,rn)
Y = trig_ray(y*pya(1),0,cv,th,rn);
markers are ZEMAX results
fanplot(y,Y,.01); hold on plot(z_axial_fan(:,1),z_axial_fan(:,2)*1e-3,'ro'); hold off
exercise 4
y = linspace(-1,1,101); Y = trig_ray(y*pya(1),0,cv,th,rn); for k=1:4 subplot(2,2,k); c = polyfit(y,Y,2*k+1); plot(y,Y,y,polyval(c,y)); title(sprintf('order %d',2*k+1)); end
exercise 5
y = z_opdfan(:,1); opd = z_opdfan(:,2); table = taylorfit(y,opd); disp('taylor fit'); show_table(table); table = zernfit(y,opd); disp('Zernike fit'); show_table(table); table = chebyfit(y,opd); disp('Chebyshev fit'); show_table(table);
taylor fit
0 2 4 6 8 10
0 -0.4687
2 -0.2083 -0.7439
4 -0.0347 -2.4016 1.8456
6 0.0021 -3.1426 3.9763 -1.4964
8 -0.0001 -3.0673 3.5768 -0.8291 -0.3441
10 0.0000 -3.0731 3.6254 -0.9708 -0.1773 -0.0683
Zernike fit
0 2 4 6 8 10 12
0 -0.4687
2 -0.5802 -0.3719
4 -0.6203 -0.2780 0.3076
6 -0.6179 -0.2566 0.2886 -0.0748
8 -0.6176 -0.2560 0.2905 -0.0759 -0.0049
10 -0.6176 -0.2560 0.2906 -0.0758 -0.0050 -0.0003
12 -0.6176 -0.2560 0.2906 -0.0757 -0.0050 -0.0003 -0.0000
Chebyshev fit
0 2 4 6 8 10 12
0 -0.4687
2 -0.5802 -0.3719
4 -0.5434 -0.2780 0.2307
6 -0.5458 -0.2846 0.2165 -0.0468
8 -0.5457 -0.2845 0.2164 -0.0474 -0.0027
10 -0.5457 -0.2845 0.2164 -0.0474 -0.0027 -0.0001
12 -0.5457 -0.2845 0.2164 -0.0474 -0.0027 -0.0001 -0.0000
exercise 6
first verify chief ray passes through center of pupil
y = linspace(-1,1,51);
Uc = 22*pi/180;
%yco = -5.12787;
yco = pyc(2,1);
Y = trig_ray((y*pya(1)+yco)*cos(Uc),Uc,cv(1:ast),th(1:ast),rn(1:ast));
subplot(1,1,1);
fanplot(y,Y,10);
It looks like the paraxial aim criteria is used. Chief ray does not go through center of pupil (no ray aiming)
yzero = interp1(Y,y,0);
fprintf('aim point %g\n', yzero*pya(1)+yco);
aim point -5.12775
trace chief ray to image
YC = trig_ray(yco*cos(Uc),Uc,cv,th,rn); fprintf('chief ray height at image: %g mm\n',YC); fprintf('gaussian image height: %g mm\n',pyc(9,1)); fprintf('distortion: %.2f%%\n',(YC-pyc(9,1))/pyc(9,1)*100);
chief ray height at image: 19.9758 mm gaussian image height: 20.1055 mm distortion: -0.64%
full-field ray trace
y = linspace(-0.55,1,101); Y = trig_ray((y*pya(1)+yco)*cos(Uc),Uc,cv,th,rn) - YC; fanplot(y,Y); hold on plot(z_full_field_fan(:,1),z_full_field_fan(:,2)*1e-3,'ro'); hold off;
exercise 7
subplot(2,1,1); c3 = polyfit(y,Y,3); yfit = polyval(c3,y); plot(y,Y,y,yfit); subplot(2,1,2); c5 = polyfit(y,Y,5); yfit=polyval(c5,y); plot(y,Y,y,yfit);
exercise 8
epsilon = lambda/abs(pya(9,2)); w = polyint(c5)/(-epsilon); fprintf('W040 %g waves\n',w(3)) fprintf('W131 %g waves\n',w(4))
W040 -3.57332 waves W131 0.495115 waves
ZEMAX opdfan
y = z_opdfan(10:41,1); opd = z_opdfan(10:41,3); w = polyfit(y,opd,8); fprintf('W040 %g waves\n',w(5)); fprintf('W131 %g waves\n',w(6));
W040 -3.01946 waves W131 0.513419 waves
on-axis test, compare to Seidel aberrations and on-axis opd fan
y = linspace(-1,1,101);
Y = trig_ray(y*pya(1),0,cv,th,rn);
subplot(1,1,1)
c = polyfit(y,Y,5);
plot(y,Y,y,polyval(c,y));
w = polyint(c)/(-epsilon);
fprintf('W040 %g waves\n',w(3));
W040 4.08932 waves