Сегодня я закончил-таки подбор параметров полноценного синусного механизма с упорным подшипником. Т.к. tex4ht выдает какую-то фигню, а latex2html имеет слишком много картинок, которые мне лень загружать (а ftp на narod не работает через проксю), выкладываю ссылочку на
описание в pdf.
Итак, выкладываю исходники к описанию.
Вычислить координаты точки контакта подшипника и толкателя можно при помощи этой функции:
function [X Y] = XYm(alpha, gamma, R, x1,y1, x2,y2)
% возвращает координаты точки контакта подшипника и упора в СК относительно
% оси вращения зеркала
% alpha - угол наклона зеркала относительно горизонтали (в градусах)
% gamma - угол при вершине толкателя
% R - радиус подшипника
% x1, y1 - координаты оси вращения в СК зеркала относительно его центра
% x2, y2 - координаты оси подшипника в той же СК
[ X0 Y0 ] = XYo(alpha, x1, y1, x2, y2);
a = gamma*pi/180.;
X = X0 + R * cos(a);
Y = Y0 - R * sin(a);
endfunction
function [X Y] = XYo(alpha, x1,y1, x2,y2)
% возвращает координаты оси подшипника
a = alpha * pi / 180.;
X = (x2-x1)*cos(a) - (y2-y1)*sin(a);
Y = (x2-x1)*sin(a) + (y2-y1)*cos(a);
endfunction
Эта функция позволяет рассчитать, как надо сместить толкатель, чтобы повернуть зеркало на нужный угол (точнее, здесь используется результат предыдущей функции):
function y = Y(gg, x1, xm, ym)
% относительное смещение толкателя в зависимости от угла
% gg - угол при вершине толкателя в градусах
% xm, ym - координаты точки касания подшипника и толкателя в СК оси вращения зеркала
w = 60.;
g = gg * pi / 180.;
y = ym + (w - x1 - xm) * cot(g);
endfunction
Эта функция позволяет определить, положение оптической оси на плоскости дифракционной решетки:
function y = Yr(alpha, x1, y1)
% координата Y пересечения луча и плоскости решетки в СК
% относительно оси вращения зеркала
% alpha - угол наклона зеркала в градусах
% x1,y1 - координаты оси вращения в СК относительно центра зеркала
w = 60.;
a = alpha*pi/180.;
dl = y1*(1-cos(a)) - tan(a).*(x1 + y1*sin(a));
Dl = -w * cot(2*a);
y = dl + Dl - y1;
endfunction
Так как множество действий приходилось постоянно повторять, я просто занес набор команд в файл:
% начальные значения
x1 = -13.6;
y1 = 0.;
x2 = 53.5; % [55, 60]
y2 = 6.5; % 20
R = 6.5; % fix
g = 28; % ~28
alpha = [ 30 : 43 ]';
%
XXX = alpha;
YYY = Yr(alpha, x1, y1);;
Legend = sprintf("YR");
for y2 = [10:5:25];
[Xm Ym] = XYm(alpha, g, R, x1,y1, x2,y2);
YS = Y(g, Xm, Ym);
YR = Yr(alpha, x1, y1);
DY = mean(YR-YS);
D = abs(YS-YR+DY);
dv = max(D);
printf("DY=%g; Deviation: max=%g, mean=%g, median=%g, std = %g\n", ...
DY, dv, mean(D), median(D), std(D));
L = sprintf("YS (y''=%3d mm, \\delta{}y=%4.3g mm)", y2, dv);
Legend = [Legend; L];
XXX = [ XXX alpha ];
YYY = [ YYY YS+DY ];
endfor
plot(XXX, YYY);
legend(Legend, 'location', 'northwest');
print -color -deps fig.eps
system('epstopdf fig.eps')
И, модифицируя его, гонял параметры туда-сюда, чтобы найти локальный (а может и глобальный) минимум функционала, позволяющего определить оптимальные параметры положения оси вращения зеркала, оси подшипника, угла при вершине толкателя, смещения толкателя...
В конечном итоге этот файл превратился у меня вот во что:
w = 60;
% начальные значения
x1 = -17.3; % -20
y1 = 0; % -15
x2 = 56; % [55, 60]
y2 = 13; % 20
R = 5.5; % было 6.5
g = 28; % ~28
alpha = [ 30 : 45 ]';
Y0pusher = 132;
%
XXX = [];
YYY = [];
Legend = [];
Legend2 = [];
dX = [];
% Y0 - координата Y вершины толкателя (относительно последней плоскости коллиматора)
% DYmax - максимальная разница между центром решетки и лучом
% dLmax - максимальное отклонение длины луча от 120мм
% dX45 - расстояние от точки касания подшипником толкателя до плоскости решетки
% Y45 - положение центра решетки при угле 45 градусов
% dYW - расстояние между центром решетки при работе с маской зрачка и центром
% решетки при максимальном угле падения (пространство для маневров
% при переходе подшипника с 45 градусов на 30 градусов)
% Axe - положение оси вращения зеркала относительно последней плоскости коллиматора
% и оптической оси
printf("var\tY0\tDYmax\tdLmax\tdX45\tY45\tdYW\tAxe\n");
%for g = [27:0.1:29];
[Xm Ym] = XYm(alpha, g, R, x1,y1, x2,y2);
YS = Y(g, x1, Xm, Ym);
YR = Yr(alpha, x1, y1);
a0 = pi/4; a = alpha * pi / 180.;
dl0 = y1*(1-cos(a0)) - tan(a0).*(x1 + y1*sin(a0));
dl = y1*(1-cos(a)) - tan(a).*(x1 + y1*sin(a));
RR = w*(1+1./sin(alpha*pi/90.))-dl0+dl - 2*w;
YO1 = w-dl0+y1;
D = abs(YS-YR);
DY = mean(D);
dv = max(D-DY);
XX = w - x1 - Xm;
dX = [dX XX];
YS += -DY+YO1;
YR += YO1;
printf("%.1f&\t%5.1f&\t%3.2f&\t%3.2f&\t%4.1f&\t%4.1f&\t%4.1f&\t(%3.1f,\t%4.1f)\\\\\n", ...
g, DY+YO1, dv, max(abs(RR)), XX(end), YS(end), 10+YS(1), x1, YO1);
L1 = sprintf("YS", x2, dv);
L2 = sprintf("YR", x2, dv);
Legend = [Legend; L1; L2];
Legend2 = [Legend2; sprintf("dX", x2)];
XXX = [ XXX alpha alpha];
%YYY = [ YYY YS-Y0pusher+2*YO1 YR+YO1 ];
YYY = [ YYY YS YR ];
%endfor
set (0, "DefaultAxesFontName", "Arial");
set (0, "DefaultTextFontSize", 38);
s = subplot(2,1,1);
p = get(s, 'pos'); p += [-0.06 -0.04 0.12 0.1]; set(s, 'pos', p);
plot(XXX, YYY, 'linewidth',2); xlabel('\alpha, ^\circ'); ylabel('Y');
axis([30,45,17,61]);
legend(Legend, 'location', 'northwest');
s = subplot(2,1,2);
p = get(s, 'pos'); p += [-0.06 -0.07 0.12 0.1]; set(s, 'pos', p);
plot(alpha, dX, 'linewidth',2); ylabel('\delta X'); xlabel('\alpha');
axis([30,45,16,34]);
legend(Legend2, 'location', 'northwest');
print -color -deps fig.eps;
system('epstopdf fig.eps');
Остается еще нарисовать эскизы для разных углов наклона, чтобы проверить - правильно ли я насчитал. А то, может, в очередной раз где-нибудь минус забыл поставить или котангенс с тангенсом перепутал…