achromatic doublet

Contents

lens specification

clear
load glass
rd = [0 30.658123 -26.733948 -25.366250  -57.832251 0];
th = [0  2 0.1 1 48.484530 0];
rn = [1 1.5168 1 1.728277 1 1];
gn = char('N-BK7', 'N-SF10');
wvl = [ 0.48613 0.58756 0.65627];
sa = [ 0 5.1 5.1 5.1 5.1 0];
cv = curvature(rd);
lp = find(rn>1);
py = 5;
puc =  tan(2*pi/180);

paraxial raytrace

pa = [py 0];
pc = [0 puc];
axial = parax(pa,cv,th,rn);
chief = parax(pc,cv,th,rn);
fprintf('\n%3s %12s %12s %12s %12s\n','srf','py','pu','pyc','puc');
for m = 1:length(th)
    fprintf('%3d %12.6f %12.6f %12.6f %12.6f\n',m-1,axial(m,:),chief(m,:));
end
srf           py           pu          pyc          puc
  0     5.000000     0.000000     0.000000     0.034921
  1     5.000000    -0.055567     0.000000     0.023023
  2     4.888866    -0.178792     0.046045     0.034031
  3     4.870986    -0.022533     0.049448     0.020512
  4     4.848453    -0.100000     0.069960     0.034569
  5     0.000000    -0.100000     1.746038     0.034569
% look-up position of each glass in Schott glass table
n = size(gn);
for k=1:n(1)
    idx(k) = strmatch(gn(k,:),glass.name);
end
wvln = linspace(0.4,0.7,21);
% calculate refractive index as function of wavelength
for k=1:length(idx)
    n = idx(k);
    rg(k,:) = sellmeier(glass.disperse(n,:),wvln);
end

Find focus shift vs. wavelength

dz = zeros(size(wvln));

rnsave = rn;
n = length(rn);
% use paraxial trace to find focus shift vs. wavelength
for k=1:length(wvln)
    for m = 1:length(lp)
        rn(lp(m)) = rg(m,k);
    end
    py = parax(pa,cv,th,rn);
    dz(k) = -py(n,1)/py(n,2);
end
rn = rnsave;
plot(dz,wvln,'k','LineWidth',2);
grid
xlabel('focus shift');
ylabel('wavelength ( \mum)');