Diferencia entre revisiones de «La Clotoide (Grupo 41)»

De MateWiki
Saltar a: navegación, buscar
Línea 158: Línea 158:
 
[[Archivo:Vectoresnormalytangente.jpg|600px|thumb|right|]]
 
[[Archivo:Vectoresnormalytangente.jpg|600px|thumb|right|]]
 
{{matlab|codigo=
 
{{matlab|codigo=
%% Parámetros
 
 
L = 4;
 
L = 4;
 
N = 3000;
 
N = 3000;
t = linspace(0, L, N)'; % columna
+
t = linspace(0,L,N)';
  
%% Derivadas analíticas
+
vx = cos(t.^2/2);
vx = cos(t.^2/2);     % gamma'(t) = velocidad = tangente
+
 
vy = sin(t.^2/2);
 
vy = sin(t.^2/2);
  
% normal unitario = rotación 90° del tangente
 
 
nx = -vy;
 
nx = -vy;
 
ny =  vx;
 
ny =  vx;
  
%% Integrar para obtener x(t), y(t)
+
x = cumtrapz(t,vx);
x = cumtrapz(t, vx);
+
y = cumtrapz(t,vy);
y = cumtrapz(t, vy);
+
  
%% Muestreo para flechas
 
 
numArrows = 40;
 
numArrows = 40;
idx = round(linspace(1, N, numArrows));
+
idx = round(linspace(1,N,numArrows));
  
%% Escalas visuales
+
scaleT = 0.2;
scaleT = 0.2;   % tamaño de vectores tangentes
+
scaleN = 0.2;
scaleN = 0.2;   % tamaño de vectores normales
+
  
%% Dibujar
+
figure
figure('Color','w','Position',[200 150 1000 650])
+
 
hold on
 
hold on
plot(x, y, 'k-', 'LineWidth', 1.6)
+
plot(x,y,'k-','LineWidth',1.6)
  
% flechas tangentes (rojo)
+
quiver(x(idx),y(idx), vx(idx)*scaleT, vy(idx)*scaleT, 0, 'Color',[0.9 0 0], 'LineWidth',1)
quiver(x(idx), y(idx), vx(idx)*scaleT, vy(idx)*scaleT, ...
+
quiver(x(idx),y(idx), nx(idx)*scaleN, ny(idx)*scaleN, 0, 'Color',[0 0 1], 'LineWidth',1)
      'AutoScale', 'off', 'Color', [0.9 0.1 0.1], 'LineWidth', 1)
+
 
+
% flechas normales (azul)
+
quiver(x(idx), y(idx), nx(idx)*scaleN, ny(idx)*scaleN, ...
+
      'AutoScale', 'off', 'Color', [0.1 0.1 0.9], 'LineWidth', 1)
+
  
 
axis equal
 
axis equal
Línea 200: Línea 188:
 
xlabel('x')
 
xlabel('x')
 
ylabel('y')
 
ylabel('y')
 +
legend('Clotoide','Vectores tangente','Vectores normal','Location','best')
 
title('Clotoide con vectores tangente y normal')
 
title('Clotoide con vectores tangente y normal')
 +
hold off
  
legend({'Clotoide \gamma(t)', 'Vectores tangente', 'Vectores normal '}, ...
 
      'Location', 'best')
 
hold off
 
 
}}
 
}}
  

Revisión del 22:03 6 dic 2025

Trabajo realizado por estudiantes
Título La Clotoide. Grupo 41
Asignatura Teoría de Campos
Curso 2025-26
Autores

Juan Luis Hermida Manso

Adolfo López March

Laura Rodríguez Neiras

Marta Marco Martín-Romo

Ángela Sánchez Barrio

Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura


1 La Clotoide

La clotoide es una curva espiral tangente al eje de abscisas en el origen, cuyo radio de curvatura disminuye de forma inversamente proporcional a la distancia recorrida sobre ella. Para analizar sus propiedades matemático-físicas, el estudio se centra en los vectores velocidad y aceleración, así como en los vectores del Triedro de Frenet (tangente y normal). Este análisis, apoyado con herramientas como MATLAB para cálculos precisos y representaciones gráficas, tiene una aplicación directa en el campo de la ingeniería civil.

La clotoide viene dada por las integrales:

[math] \gamma(t) = (x(t),y(t)) = \left( \int_{0}^{t} \cos\!\left(\frac{s^{2}}{2}\right)\, ds,\; \int_{0}^{t} \sin\!\left(\frac{s^{2}}{2}\right)\, ds \right),\quad 0 \le t \le 4. [/math]


1.1 Dibujo de la curva

La curva se dibuja en MATLAB con el siguiente código:

Clotoide γ(t) para 0 ≤ t ≤ 4
L = 4;
N = 4000;
t = linspace(0, L, N);

xprime = cos(t.^2/2);
yprime = sin(t.^2/2);

x = cumtrapz(t, xprime);
y = cumtrapz(t, yprime);

plot(x, y, 'LineWidth', 1.6)
axis equal
grid on
xlabel('x')
ylabel('y')
title('Clotoide \gamma(t), 0 \leq t \leq 4')


1.2 Vectores velocidad y aceleración

Partimos de la definición de la curva:

[math] \gamma(t)=\left( \int_{0}^{t}\cos\left(\frac{s^{2}}{2}\right)\,ds,\ \int_{0}^{t}\sin\left(\frac{s^{2}}{2}\right)\,ds \right) [/math]

Derivando bajo el signo integral obtenemos fórmulas cerradas para velocidad y aceleración:

[math] \boxed{ \gamma'(t)=\left( \cos\left(\frac{t^{2}}{2}\right),\ \sin\left(\frac{t^{2}}{2}\right) \right) } [/math]

[math] \boxed{ \gamma''(t)=\left( -\,t\sin\left(\frac{t^{2}}{2}\right),\ t\cos\left(\frac{t^{2}}{2}\right) \right) } [/math]

1.2.1 Dibujo de los vectores velocidad y aceleración

La curva con sus vectores velocidad y aceleración se expresa en MATLAB con el siguiente código:

Clotoide γ(t) para 0 ≤ t ≤ 4
L = 4; N = 3000;
t = linspace(0,L,N);

vx = cos(t.^2/2);
vy = sin(t.^2/2);
ax = -t .* sin(t.^2/2);
ay =  t .* cos(t.^2/2);

x = cumtrapz(t, vx);
y = cumtrapz(t, vy);

numArrows = 60;
idx = round(linspace(1,N,numArrows));
scaleV = 0.2;
scaleA = 0.05;

figure
plot(x,y,'k-','LineWidth',1.4), hold on
plot(x(idx),y(idx),'ko','MarkerSize',3,'MarkerFaceColor','k')
quiver(x(idx),y(idx), vx(idx)*scaleV, vy(idx)*scaleV, 0, 'b','LineWidth',1);
quiver(x(idx),y(idx), ax(idx)*scaleA, ay(idx)*scaleA, 0, 'r','LineWidth',1);

xlabel('x'), ylabel('y')
axis equal, grid on
legend('Clotoide','Puntos muestreo','Velocidad','Aceleración','Location','best')
title('Clotoide y vectores velocidad y aceleración')
hold off

1.3 Longitud de la curva

La longitud entre 0 y 4 es:

[math] L=\int_0^4 \|\gamma'(t)\|\,dt [/math]

pero

[math] \|\gamma'(t)\|=\sqrt{\cos^2\left(\frac{t^2}{2}\right)+\sin^2\left(\frac{t^2}{2}\right)}=1. [/math]

Por tanto:

[math] \boxed{ L=\int_0^4 1\,dt = 4. } [/math]

1.4 Vectores tangente y normal

Los vectores tangente y normal se obtienen a partir de la derivada:

[math] \gamma'(t)=\left(\cos\left(\frac{t^2}{2}\right),\ \sin\left(\frac{t^2}{2}\right)\right) [/math]

Como [math]\|\gamma'(t)\|=1[/math], el vector tangente unitario es:

[math] \mathbf{t}(t)=\gamma'(t) [/math]

El vector normal unitario (rotación de [math]\mathbf{t}(t)[/math] en [math]+\pi/2[/math]) es:

[math] \mathbf{n}(t)=\left(-\sin\left(\frac{t^{2}}{2}\right),\ \cos\left(\frac{t^{2}}{2}\right)\right) [/math]

1.4.1 Dibujo de vectores tangente y normal

La curva con sus vectores tangente y normal se expresa en MATLAB con el siguiente código:

Vectoresnormalytangente.jpg
L = 4;
N = 3000;
t = linspace(0,L,N)';

vx = cos(t.^2/2);
vy = sin(t.^2/2);

nx = -vy;
ny =  vx;

x = cumtrapz(t,vx);
y = cumtrapz(t,vy);

numArrows = 40;
idx = round(linspace(1,N,numArrows));

scaleT = 0.2;
scaleN = 0.2;

figure
hold on
plot(x,y,'k-','LineWidth',1.6)

quiver(x(idx),y(idx), vx(idx)*scaleT, vy(idx)*scaleT, 0, 'Color',[0.9 0 0], 'LineWidth',1)
quiver(x(idx),y(idx), nx(idx)*scaleN, ny(idx)*scaleN, 0, 'Color',[0 0 1], 'LineWidth',1)

axis equal
grid on
xlabel('x')
ylabel('y')
legend('Clotoide','Vectores tangente','Vectores normal','Location','best')
title('Clotoide con vectores tangente y normal')
hold off


1.5 Curvatura

Para calcular la curvatura usamos las expresiones obtenidas anteriormente:

[math] \gamma'(t)=\left( \cos\left(\frac{t^{2}}{2}\right),\ \sin\left(\frac{t^{2}}{2}\right) \right) [/math]

[math] \gamma''(t)=\left( -\,t\sin\left(\frac{t^{2}}{2}\right),\ t\cos\left(\frac{t^{2}}{2}\right) \right) [/math]

La fórmula general de la curvatura es:

[math] \kappa(t)= \frac{ \left| x'(t)\,y''(t)-y'(t)\,x''(t) \right| }{ \left(x'(t)^{2}+y'(t)^{2}\right)^{3/2} }. [/math]

Como

[math] x'(t)^{2}+y'(t)^{2} = \cos^{2}\left(\frac{t^{2}}{2}\right)+\sin^{2}\left(\frac{t^{2}}{2}\right) =1, [/math]

la fórmula se reduce a:

[math]\kappa(t)=\frac{\left|x'(t)y''(t)-y'(t)x''(t)\right|}{\left(x'(t)^2+y'(t)^2\right)^{3/2}}[/math]


Sustituyendo:

[math] x'(t)=\cos\left(\frac{t^{2}}{2}\right),\qquad y'(t)=\sin\left(\frac{t^{2}}{2}\right) [/math]

[math] x''(t)=-t\sin\left(\frac{t^{2}}{2}\right),\qquad y''(t)=t\cos\left(\frac{t^{2}}{2}\right) [/math]

obtenemos:

[math] x'(t)\,y''(t)-y'(t)\,x''(t) = t\left( \cos^{2}\left(\frac{t^{2}}{2}\right) + \sin^{2}\left(\frac{t^{2}}{2}\right) \right) =t [/math]

Por tanto, la curvatura de la clotoide es:

[math] \boxed{\kappa(t)=t} [/math]

1.5.1 Gráfica de la curvatura

La gráfica de la curvatura se expresa en MATLAB con el siguiente código:

Curvatura41.jpg
L = 4;
N = 2000;
t = linspace(0, L, N);

%% Curvatura teórica (es exactamente t)
kappa = t;

%% Dibujo
figure('Color','w','Position',[300 200 900 500])
plot(t, kappa, 'LineWidth', 2)
grid on
xlabel('t')
ylabel('\kappa(t)')
title('Curvatura de la clotoide: \kappa(t) = t')


1.6 Circunferencia osculatriz

Consideramos el punto 𝑃 = 𝛾(4).

La curvatura es: [math]\kappa(t)=t[/math]

por tanto el radio de la circunferencia osculatriz es: [math]R=\frac{1}{\kappa(1.5)}=\frac{1}{1.5}=\frac{2}{3}.[/math]

El vector normal unitario es: [math] \mathbf{n}(t)=\left( -\sin\left(\frac{t^{2}}{2}\right), \ \cos\left(\frac{t^{2}}{2}\right) \right) [/math]

El centro de la circunferencia osculatriz se calcula como: [math] Q=\gamma(1.5)+R\,\mathbf{n}(1.5) [/math]

Aproximando numéricamente: [math] \gamma(1.5)\approx(1.32096,\;0.51365) [/math]

[math] \mathbf{n}(1.5)\approx(-0.90227,\;0.43118) [/math]

[math] Q\approx(0.71945,\;0.80110) [/math]

Por tanto: [math] \boxed{R\approx 0.6667,\qquad Q\approx(0.71945,\;0.80110)}. [/math]

1.6.1 Dibujo de la circunferencia osculatriz

Circulo41.jpg
%% Parámetros
L = 4;
N = 5000;
t = linspace(0, L, N)';

%% Derivadas analíticas
vx = cos(t.^2/2);
vy = sin(t.^2/2);

%% Posición gamma(t)
x = cumtrapz(t, vx);
y = cumtrapz(t, vy);

%% Punto P = gamma(4)
t0 = 4;
xP = interp1(t, x, t0, 'pchip');
yP = interp1(t, y, t0, 'pchip');
P = [xP; yP];

%% Curvatura y radio osculador
kappa = t0;
R = 1/kappa;

%% Normal unitario en t = 4
nx = -sin(t0^2/2);
ny =  cos(t0^2/2);
n0 = [nx; ny];

%% Centro del círculo osculador
Cx = xP + R * nx;
Cy = yP + R * ny;
C = [Cx; Cy];

%% Dibujar el círculo
theta = linspace(0, 2*pi, 400);
xc = Cx + R*cos(theta);
yc = Cy + R*sin(theta);

%% Gráfica
figure('Color','w','Position',[250 150 900 600])
hold on

plot(x, y, 'k-', 'LineWidth', 1.6)                 % clotoide
plot(xc, yc, 'r--', 'LineWidth', 1.6)              % círculo osculador

plot(xP, yP, 'bo', 'MarkerFaceColor', 'b', 'MarkerSize', 8) % punto P
plot(Cx, Cy, 'ro', 'MarkerFaceColor', 'r', 'MarkerSize', 8) % centro C

% Texto con coordenadas
text(Cx + 0.03, Cy, sprintf('Centro C = \n (%.6f, %.6f)', Cx, Cy), 'FontSize', 9)
text(xP + 0.03, yP, sprintf('P = \\gamma(4)'), 'FontSize', 11)

axis equal
grid on
xlabel('x')
ylabel('y')
title('Clotoide y círculo osculador en t = 4')
legend('Clotoide', 'Círculo osculador', 'P = \gamma(4)', 'Centro C', 'Location', 'best')

hold off

%% Mostrar en consola
fprintf('P = (%.6f, %.6f)\n', xP, yP);
fprintf(['Centro C = (%.6f, %.6f)\n'], Cx, Cy);
fprintf('Radio R = %.6f\n', R);


2 Usos en la ingeniería

2.1 Información sobre la curva dada

La clotoide es una curva pensada para que el paso entre una trayectoria recta y una curva circular se realice de forma progresiva. Su particularidad es que la curvatura no aparece de golpe, sino que aumenta de manera uniforme a lo largo del recorrido. Al inicio el radio es prácticamente infinito, lo que hace que la curva sea casi imperceptible, y a medida que avanzamos ese radio se reduce poco a poco hasta tomar un valor fijo, formando así una curva cada vez más pronunciada.

En el ámbito de la ingeniería este comportamiento resulta especialmente útil. Carreteras y líneas ferroviarias suelen incluir tramos basados en clotoides para enlazar rectas con curvas cerradas sin generar cambios bruscos en la aceleración lateral. Este aumento gradual de la curvatura evita sacudidas, reduce la sensación de giro repentino y contribuye tanto a la comodidad de los pasajeros como a la estabilidad del vehículo. Si la transición no se gestionara de esta manera, el aumento de la fuerza centrípeta sería inmediato y las maniobras resultarían mucho más incómodas o incluso peligrosas.

Las propiedades de la clotoide también la hacen adecuada para otros campos en los que se necesitan trayectorias suaves y predecibles. Puede encontrarse en el diseño de canales para mejorar el comportamiento del flujo del agua, en la planificación de maniobras de entrada y salida de embarcaciones o en la creación de curvas más seguras y fluidas en atracciones como montañas rusas.

2.2 Estructuras civiles con aplicaciones de la clotoide

3 Hélice cónica

Elicoide41.jpg
%% Parámetros
t_min = 2*pi;
t_max = 6*pi;
Nt = 800;    % resolución en t (más grande => más suave)
Nu = 40;     % resolución en u (0..1 para segmentos de longitud 1)
t = linspace(t_min, t_max, Nt)';

%% Prealocar arrays
Xg = zeros(Nt,1); Yg = zeros(Nt,1); Zg = zeros(Nt,1);
tg = zeros(Nt,3);    % gamma'(t)
er = zeros(Nt,3);    % e_rho(t)
d_raw = zeros(Nt,3); % componente ortogonal (antes de normalizar)
d_hat = zeros(Nt,3); % dirección final normalizada (longitud 1)

%% Calcular gamma, gamma' y e_rho para cada t
for i = 1:Nt
    ti = t(i);
    % gamma(t)
    Xg(i) = ti * cos(ti);
    Yg(i) = ti * sin(ti);
    Zg(i) = ti;
    
    % tangente gamma'(t) = [cos t - t sin t, sin t + t cos t, 1]
    tg(i,1) = cos(ti) - ti * sin(ti);
    tg(i,2) = sin(ti) + ti * cos(ti);
    tg(i,3) = 1;
    
    % e_rho(t)
    er(i,:) = [cos(ti), sin(ti), 0];
end

%% Proyección: d(t) = er - proj_{tg}(er)
tg_norm2 = sum(tg.^2, 2);
er_dot_tg = sum(er .* tg, 2);

eps_tol = 1e-12;
tg_norm2(tg_norm2 < eps_tol) = eps_tol;

for i = 1:Nt
    proj = (er_dot_tg(i) / tg_norm2(i)) * tg(i,:);
    d = er(i,:) - proj;
    
    if norm(d) < 1e-10
        tgi = tg(i,1:2);
        d = [-tgi(2), tgi(1), 0];
        if norm(d) < 1e-10
            d = [0,0,1];
        end
    end
    
    d_raw(i,:) = d;
    d_hat(i,:) = d / norm(d);
end

%% Construir superficie S(t,u) = gamma(t) + u * d_hat(t)
u = linspace(0,1,Nu);
[Tgrid, Ugrid] = meshgrid(t, u);

Xg_m = repmat(Xg', Nu, 1);
Yg_m = repmat(Yg', Nu, 1);
Zg_m = repmat(Zg', Nu, 1);

d_x = repmat(d_hat(:,1)', Nu, 1);
d_y = repmat(d_hat(:,2)', Nu, 1);
d_z = repmat(d_hat(:,3)', Nu, 1);

X = Xg_m + Ugrid .* d_x;
Y = Yg_m + Ugrid .* d_y;
Z = Zg_m + Ugrid .* d_z;

%% Plot: superficie + curva + segmentos
figure('Color','w','Position',[100 80 1200 800])
surf(X, Y, Z, 'FaceAlpha', 0.88, 'EdgeColor', 'none');
hold on
plot3(Xg, Yg, Zg, 'k-', 'LineWidth', 2.0)

numSeg = 50;
idx = round(linspace(1, Nt, numSeg));

for k = 1:length(idx)
    i = idx(k);
    P = [Xg(i), Yg(i), Zg(i)];
    Q = P + d_hat(i,:) * 1.0;
    plot3([P(1), Q(1)], [P(2), Q(2)], [P(3), Q(3)], 'r-', 'LineWidth', 1.4)
    plot3(P(1), P(2), P(3), 'bo', 'MarkerFaceColor','b', 'MarkerSize', 4)
end

axis equal
grid on
xlabel('x'); ylabel('y'); zlabel('z');
title('Hélice cónica y helicoide cónico (segmentos ortogonales, longitud 1)', 'FontSize', 12)
view(40,25)
camlight; lighting gouraud

legend({'Superficie reglada','Curva \gamma(t)','Segmentos (muestra)'}, 'Location','best')

hold off

%% Comprobación ortogonalidad
fprintf('Comprobación ortogonalidad (dot(dhat, tg) cerca de 0):\n');
for k = 1:length(idx)
    i = idx(k);
    fprintf('t=%.3f


3.1 Distribución de la densidad a lo largo de la hélice

Se da la densidad sobre la superficie:

[math]\displaystyle f(x_1,x_2,x_3)=\frac{x_1^2+x_2^2}{x_3}[/math]

Sustituyendo la parametrización obtenemos, sobre la superficie,

[math]\displaystyle x_1^2+x_2^2=(t+u)^2,\qquad x_3=t,[/math]

por tanto la densidad en coordenadas es

[math]\displaystyle f(\Phi(u,t))=\frac{(t+u)^2}{t}.[/math]

Para calcular la masa es necesario multiplicar por el elemento de área de la superficie. Calculando derivadas:

[math]\displaystyle \Phi_u=(\cos t,\ \sin t,\ 0),[/math]

[math]\displaystyle \Phi_t=\bigl(- (t+u)\sin t+\cos t,\ (t+u)\cos t+\sin t,\ 1\bigr).[/math]

El módulo del producto vectorial se simplifica a

[math]\displaystyle |\Phi_u\times\Phi_t|=\sqrt{(t+u)^2+1}.[/math]

Por tanto la masa M viene dada por la integral doble:

[math]\displaystyle M=\int_{2\pi}^{6\pi}\int_{0}^{1}\frac{(t+u)^2}{t}\,\sqrt{(t+u)^2+1}\;du\,dt. [/math]

M se aproxima a 2406,03

3.2 Estructuras civiles con la aplicación de la hélice cónica

Museo Solomon R. Guggenheim (Nueva York, Estados Unidos)

4 Poster

Archivo:La clotoide poster.pdf

5 Bibliografía

https://moodle.upm.es/

https://images.google.com/

https://mat.caminos.upm.es/wiki/P%C3%A1gina_principal