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

Jul 19, 2012 22:33

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

octave, синусный механизм, математическое моделирование

Previous post Next post
Up