Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Categories:

Синусный механизм - 2

Сегодня я закончил-таки подбор параметров полноценного синусного механизма с упорным подшипником. Т.к. 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');

Остается еще нарисовать эскизы для разных углов наклона, чтобы проверить — правильно ли я насчитал. А то, может, в очередной раз где-нибудь минус забыл поставить или котангенс с тангенсом перепутал…
Tags: octave, математическое моделирование, синусный механизм
Subscribe

  • А что, в С так нельзя?

    Пытаюсь передать в функцию цвет как массив. Функция такая: void Pattern_draw3(Img3 *img, Pattern *p, int xul, int yul, uint8_t colr[3]); И…

  • Ардуиноподход

    Вот как ни гляну, большинство народу для считывания данных калибровки в BMP/BME280 использует типичный ардуиноподход, как, например, здесь: зачем-то…

  • Темы-2

    Некоторые испугались, прочитав предыдущие темы. Повторяю: темы для работы в течение всей школы (три года). А вот — их части, которые можно осилить за…

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 5 comments