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

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

Date: 2012-07-23 11:11 am (UTC)
From: [identity profile] vk68.livejournal.com
Оффтоп. И получится как у Жуль Верна с изменением земной оси.

Date: 2012-07-23 07:27 pm (UTC)
From: [identity profile] Сергей Хотеев (from livejournal.com)
Хотел спросить, чем вы в Octave графики склеиваете и сглаживаете, мне данные со спектрографа нужно в приемлимый вид привести, я конечно по пишу самописные велосипеды и gnuplot поковыряю, но может люди уже что-то сделали до меня в octave?

Date: 2012-07-23 07:48 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Использую всякие стандартные средства (фурье-фильтрация, сплайны). Аппроксимации всякие. В общем, почти все, что есть в матлабе, реализовано и в октаве.

Date: 2012-07-23 08:11 pm (UTC)
From: [identity profile] Сергей Хотеев (from livejournal.com)
Посоветуете какую книжку?, а то я начинал с тоненькой, для Кембриджских курсов.
И конечно же меня волнует совпадение имен функций

Date: 2012-07-23 08:41 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Для обработки одномерных сигналов советую Сергиенко почитать, а по двумерным (изображениям) - Гонсалеса и Вудса.

Практически весь базовый набор матлабовских функций в октаве реализован. С вейвлетами, правда, плоховато: есть тулбокс, но как-то он совершенно не так работает, как в матлабе.

Еще графики можно рисовать при помощи MathGL (я начал было писать "прокладку" для октавы, но забросил) — если сглаженные данные не нужны, а нужна лишь красивая картинка, можно средствами MathGL'я все сделать. В гнуплоте, правда, тоже есть какие-то основные аппроксимации/интерполяции, но октава не имеет интерфейса для них.

May 2025

S M T W T F S
    123
45678910
11121314151617
1819202122 2324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 23rd, 2025 07:47 am
Powered by Dreamwidth Studios