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

De MateWiki
Saltar a: navegación, buscar
 
(No se muestran 17 ediciones intermedias del mismo usuario)
Línea 32: Línea 32:
 
[[Archivo:clotoide41.jpg|600px|thumb|right|Clotoide γ(t) para 0 ≤ t ≤ 4]]
 
[[Archivo:clotoide41.jpg|600px|thumb|right|Clotoide γ(t) para 0 ≤ t ≤ 4]]
 
{{matlab|codigo=
 
{{matlab|codigo=
% t en [0, L], con L = 4
 
 
 
L = 4;
 
L = 4;
N = 4000;                 % número de puntos para buena precisión
+
N = 4000;
 
+
 
t = linspace(0, L, N);
 
t = linspace(0, L, N);
  
% derivadas analíticas
 
 
xprime = cos(t.^2/2);
 
xprime = cos(t.^2/2);
 
yprime = sin(t.^2/2);
 
yprime = sin(t.^2/2);
  
% integrales definidas para x(t), y(t)
 
 
x = cumtrapz(t, xprime);
 
x = cumtrapz(t, xprime);
 
y = cumtrapz(t, yprime);
 
y = cumtrapz(t, yprime);
  
% dibujo
 
figure('Color','w','Position',[200 200 800 600])
 
 
plot(x, y, 'LineWidth', 1.6)
 
plot(x, y, 'LineWidth', 1.6)
 
axis equal
 
axis equal
Línea 56: Línea 49:
 
title('Clotoide \gamma(t), 0 \leq t \leq 4')
 
title('Clotoide \gamma(t), 0 \leq t \leq 4')
 
}}
 
}}
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
  
 
==Vectores velocidad y aceleración==
 
==Vectores velocidad y aceleración==
Línea 91: Línea 94:
 
[[Archivo:Vectoresvelocidadyaceleracion41.jpg|600px|thumb|right|Clotoide γ(t) para 0 ≤ t ≤ 4]]
 
[[Archivo:Vectoresvelocidadyaceleracion41.jpg|600px|thumb|right|Clotoide γ(t) para 0 ≤ t ≤ 4]]
 
<syntaxhighlight lang="matlab">
 
<syntaxhighlight lang="matlab">
try
+
L = 4; N = 3000;
    %% Parámetros
+
t = linspace(0,L,N);
    L = 4;
+
    N = 3000;   % resolución (aumentar para más suavidad)
+
    t = linspace(0, L, N);
+
  
    %% Derivadas analíticas (componentes)
+
vx = cos(t.^2/2);
    vx = cos(t.^2 / 2);   % x'(t)
+
vy = sin(t.^2/2);
    vy = sin(t.^2 / 2);   % y'(t)
+
ax = -t .* sin(t.^2/2);
    ax = -t .* sin(t.^2 / 2); % x''(t)
+
ay =  t .* cos(t.^2/2);
    ay =  t .* cos(t.^2 / 2); % y''(t)
+
  
    %% Integración numérica para obtener la curva
+
x = cumtrapz(t, vx);
    x = cumtrapz(t, vx);
+
y = cumtrapz(t, vy);
    y = cumtrapz(t, vy);
+
  
    %% Punto gamma(1.5)
+
numArrows = 60;
    t0 = 1.5;
+
idx = round(linspace(1,N,numArrows));
    xP = interp1(t, x, t0, 'pchip');
+
scaleV = 0.2;
    yP = interp1(t, y, t0, 'pchip');
+
scaleA = 0.05;
  
    %% Muestreo para vectores
+
figure
    numArrows = 60;
+
plot(x,y,'k-','LineWidth',1.4), hold on
    idx = round(linspace(1, N, numArrows));
+
plot(x(idx),y(idx),'ko','MarkerSize',3,'MarkerFaceColor','k')
    scaleVel = 0.2;
+
quiver(x(idx),y(idx), vx(idx)*scaleV, vy(idx)*scaleV, 0, 'b','LineWidth',1);
    scaleAcc = 0.05;
+
quiver(x(idx),y(idx), ax(idx)*scaleA, ay(idx)*scaleA, 0, 'r','LineWidth',1);
  
    %% Dibujar
+
xlabel('x'), ylabel('y')
    figure('Color','w','Position',[200 150 1000 650])
+
axis equal, grid on
    hold on
+
legend('Clotoide','Puntos muestreo','Velocidad','Aceleración','Location','best')
    plot(x, y, 'k-', 'LineWidth', 1.6);
+
title('Clotoide y vectores velocidad y aceleración')
    plot(x(idx), y(idx), 'ko', 'MarkerSize', 3, 'MarkerFaceColor','k');
+
hold off
  
    quiver(x(idx), y(idx), vx(idx)*scaleVel, vy(idx)*scaleVel, 0, ...
 
          'Color',[0.85 0.1 0.1], 'LineWidth', 1.0);
 
 
    quiver(x(idx), y(idx), ax(idx)*scaleAcc, ay(idx)*scaleAcc, 0, ...
 
          'Color',[0.1 0.2 0.8], 'LineWidth', 1.0);
 
 
    plot(xP, yP, 'ro', 'MarkerFaceColor','r', 'MarkerSize',8)
 
    text(xP + 0.02, yP + 0.02, sprintf('P = γ(%.2f)', t0), 'FontSize',10);
 
 
    legend('Clotoide', 'Velocidad', 'Aceleración');
 
 
    axis equal
 
    grid on
 
    xlabel('x')
 
    ylabel('y')
 
    title('Clotoide y vectores velocidad y aceleración')
 
    hold off
 
 
catch ME
 
    fprintf(2, 'Error:\n%s\n', ME.message);
 
end
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Línea 191: Línea 168:
 
[[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 233: Línea 198:
 
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')
 
legend({'Clotoide \gamma(t)', 'Vectores tangente', 'Vectores normal '}, ...
 
      'Location', 'best')
 
 
hold off
 
hold off
 +
 
}}
 
}}
  
Línea 322: Línea 286:
 
N = 2000;
 
N = 2000;
 
t = linspace(0, L, N);
 
t = linspace(0, L, N);
 
%% Curvatura teórica (es exactamente t)
 
 
kappa = t;
 
kappa = t;
  
%% Dibujo
+
figure
figure('Color','w','Position',[300 200 900 500])
+
 
plot(t, kappa, 'LineWidth', 2)
 
plot(t, kappa, 'LineWidth', 2)
 
grid on
 
grid on
Línea 333: Línea 294:
 
ylabel('\kappa(t)')
 
ylabel('\kappa(t)')
 
title('Curvatura de la clotoide: \kappa(t) = t')
 
title('Curvatura de la clotoide: \kappa(t) = t')
 +
 +
 +
 +
 
}}
 
}}
 +
 +
 +
 +
 +
 +
  
 
==Circunferencia osculatriz==
 
==Circunferencia osculatriz==
Consideramos el punto 𝑃 = 𝛾(4).
+
Consideramos el punto <math>P=\gamma(1.5)</math>.
  
 
La curvatura es:
 
La curvatura es:
<math>\kappa(t)=t</math>
+
<math>
 +
\kappa(t)=t
 +
</math>
  
 
por tanto el radio de la circunferencia osculatriz es:
 
por tanto el radio de la circunferencia osculatriz es:
<math>R=\frac{1}{\kappa(1.5)}=\frac{1}{1.5}=\frac{2}{3}.</math>
+
<math>
 +
R=\frac{1}{\kappa(1.5)}=\frac{1}{1.5}=\frac{2}{3}\approx 0.6667.
 +
</math>
  
 
El vector normal unitario es:
 
El vector normal unitario es:
 
<math>
 
<math>
\mathbf{n}(t)=\left(
+
\mathbf{n}(t)=\left(\,-\sin\left(\frac{t^{2}}{2}\right),\;\cos\left(\frac{t^{2}}{2}\right)\right).
-\sin\left(\frac{t^{2}}{2}\right),
+
\ \cos\left(\frac{t^{2}}{2}\right)
+
\right)
+
 
</math>
 
</math>
  
El centro de la circunferencia osculatriz se calcula como:
+
Evaluando en <math>t=1.5</math>:
 
<math>
 
<math>
Q=\gamma(1.5)+R\,\mathbf{n}(1.5)
+
\mathbf{n}(1.5)=\left(-\sin\left(\frac{1.5^{2}}{2}\right),\;\cos\left(\frac{1.5^{2}}{2}\right)\right)
 +
\approx (-0.90227,\;0.43118).
 
</math>
 
</math>
  
Aproximando numéricamente:
+
El punto de la clotoide es:
 
<math>
 
<math>
\gamma(1.5)\approx(1.32096,\;0.51365)
+
\gamma(1.5)=\left(\int_{0}^{1.5}\cos\left(\frac{s^{2}}{2}\right)\,ds,\;
 +
\int_{0}^{1.5}\sin\left(\frac{s^{2}}{2}\right)\,ds\right)
 +
\approx (1.32096,\;0.51365).
 
</math>
 
</math>
  
 +
El centro de la circunferencia osculatriz se calcula como:
 
<math>
 
<math>
\mathbf{n}(1.5)\approx(-0.90227,\;0.43118)
+
Q=\gamma(1.5)+R\,\mathbf{n}(1.5)
 
</math>
 
</math>
  
 +
Sustituyendo numéricamente:
 
<math>
 
<math>
Q\approx(0.71945,\;0.80110)
+
Q \approx (1.32096,\;0.51365) + 0.6667\,(-0.90227,\;0.43118)
 
</math>
 
</math>
  
Por tanto:
 
 
<math>
 
<math>
\boxed{R\approx 0.6667,\qquad Q\approx(0.71945,\;0.80110)}.
+
Q \approx (0.71945,\;0.80110).
 
</math>
 
</math>
 +
 +
''Por tanto:'' 
 +
<math>
 +
R \approx 0.6667, \qquad Q \approx (0.71945,\;0.80110).
 +
</math>
 +
  
 
===Dibujo de la circunferencia osculatriz===
 
===Dibujo de la circunferencia osculatriz===
[[Archivo:Circulo41.jpg|600px|thumb|right|]]
+
[[Archivo:Circulbueno.jpg|600px|thumb|right|]]
 
{{matlab|codigo=
 
{{matlab|codigo=
%% Parámetros
+
clear; close all; clc
 +
 
 
L = 4;
 
L = 4;
N = 5000;
+
N = 15000;
t = linspace(0, L, N)';
+
t = linspace(0,L,N);
  
%% Derivadas analíticas
 
 
vx = cos(t.^2/2);
 
vx = cos(t.^2/2);
 
vy = sin(t.^2/2);
 
vy = sin(t.^2/2);
  
%% Posición gamma(t)
 
 
x = cumtrapz(t, vx);
 
x = cumtrapz(t, vx);
 
y = cumtrapz(t, vy);
 
y = cumtrapz(t, vy);
  
%% Punto P = gamma(4)
+
t0 = 1.5;
t0 = 4;
+
x0 = interp1(t, x, t0, 'pchip');
xP = interp1(t, x, t0, 'pchip');
+
y0 = interp1(t, y, 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);
 
nx = -sin(t0^2/2);
 
ny =  cos(t0^2/2);
 
ny =  cos(t0^2/2);
n0 = [nx; ny];
 
  
%% Centro del círculo osculador
+
R = 1 / t0;
Cx = xP + R * nx;
+
Cx = x0 + R*nx;
Cy = yP + R * ny;
+
Cy = y0 + R*ny;
C = [Cx; Cy];
+
  
%% Dibujar el círculo
+
theta = linspace(0,2*pi,400);
theta = linspace(0, 2*pi, 400);
+
 
xc = Cx + R*cos(theta);
 
xc = Cx + R*cos(theta);
 
yc = Cy + R*sin(theta);
 
yc = Cy + R*sin(theta);
  
%% Gráfica
+
figure('Color','w','Position',[200 200 800 600])
figure('Color','w','Position',[250 150 900 600])
+
plot(x,y,'k-','LineWidth',1.6), hold on
hold on
+
plot(xc,yc,'r--','LineWidth',1.6)
 +
plot(x0,y0,'bo','MarkerFaceColor','b','MarkerSize',6)
 +
plot(Cx,Cy,'ro','MarkerFaceColor','r','MarkerSize',6)
  
plot(x, y, 'k-', 'LineWidth', 1.6)                 % clotoide
+
axis equal, grid on
plot(xc, yc, 'r--', 'LineWidth', 1.6)             % círculo osculador
+
xlabel('x'), ylabel('y')
 +
title('Clotoide y circunferencia osculatriz en t = 1.5')
  
plot(xP, yP, 'bo', 'MarkerFaceColor', 'b', 'MarkerSize', 8) % punto P
+
% Leyenda en el mismo sitio que antes:
plot(Cx, Cy, 'ro', 'MarkerFaceColor', 'r', 'MarkerSize', 8) % centro C
+
legend('Clotoide','Circunferencia osculatriz','P = \gamma(1.5)','Centro C', ...
 
+
      'Location','northeast')
% 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
 
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);
 
 
}}
 
}}
  
Línea 465: Línea 425:
 
[[Archivo:Elicoide41.jpg|600px|thumb|right|]]
 
[[Archivo:Elicoide41.jpg|600px|thumb|right|]]
 
{{matlab|codigo=
 
{{matlab|codigo=
%% Parámetros
+
tmin = 2*pi; tmax = 6*pi;
t_min = 2*pi;
+
Nt = 800; Nu = 40;
t_max = 6*pi;
+
t = linspace(tmin,tmax,Nt).';
Nt = 800;   % resolución en t (más grande => más suave)
+
u = linspace(-0.8,0.8,Nu);
Nu = 40;     % resolución en u (0..1 para segmentos de longitud 1)
+
t = linspace(t_min, t_max, Nt)';
+
  
%% Prealocar arrays
+
ti = t;
Xg = zeros(Nt,1); Yg = zeros(Nt,1); Zg = zeros(Nt,1);
+
Xg = ti .* cos(ti);
tg = zeros(Nt,3);    % gamma'(t)
+
Yg = ti .* sin(ti);
er = zeros(Nt,3);   % e_rho(t)
+
Zg = ti;
d_raw = zeros(Nt,3); % componente ortogonal (antes de normalizar)
+
gamma = [Xg Yg Zg];
d_hat = zeros(Nt,3); % dirección final normalizada (longitud 1)
+
  
%% Calcular gamma, gamma' y e_rho para cada t
+
tg = [cos(ti) - ti.*sin(ti), sin(ti) + ti.*cos(ti), ones(Nt,1)];         % tangente (no normalizada)
for i = 1:Nt
+
er = [cos(ti), sin(ti), zeros(Nt,1)];                                     % vector radial en XY
    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)
+
tg2 = sum(tg.^2,2);
tg_norm2 = sum(tg.^2, 2);
+
proj = ( sum(er.*tg,2) ./ tg2 );                                          % coeficiente de proyección
er_dot_tg = sum(er .* tg, 2);
+
d = er - proj .* tg;                                                     
 +
d_hat = d ./ vecnorm(d,2,2);
  
eps_tol = 1e-12;
+
[Ugrid,Tgrid] = meshgrid(u,1:Nt);
tg_norm2(tg_norm2 < eps_tol) = eps_tol;
+
X = Xg + Ugrid .* d_hat(:,1);
 +
Y = Yg + Ugrid .* d_hat(:,2);
 +
Z = Zg + Ugrid .* d_hat(:,3);
  
for i = 1:Nt
+
figure('Color','w')
    proj = (er_dot_tg(i) / tg_norm2(i)) * tg(i,:);
+
surf(X,Y,Z,'FaceAlpha',0.88,'EdgeColor','none'), hold on
    d = er(i,:) - proj;
+
plot3(Xg,Yg,Zg,'k-','LineWidth',1.8)
   
+
    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;
 
numSeg = 50;
idx = round(linspace(1, Nt, numSeg));
+
idx = round(linspace(1,Nt,numSeg));
 
+
 
for k = 1:length(idx)
 
for k = 1:length(idx)
 
     i = idx(k);
 
     i = idx(k);
 
     P = [Xg(i), Yg(i), Zg(i)];
 
     P = [Xg(i), Yg(i), Zg(i)];
 
     Q = P + d_hat(i,:) * 1.0;
 
     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) Q(1)],[P(2) Q(2)],[P(3) Q(3)],'r-','LineWidth',1.2)
    plot3(P(1), P(2), P(3), 'bo', 'MarkerFaceColor','b', 'MarkerSize', 4)
+
 
end
 
end
  
axis equal
+
axis equal, grid on
grid on
+
xlabel('x'), ylabel('y'), zlabel('z')
xlabel('x'); ylabel('y'); zlabel('z');
+
title('Hélice cónica y helicoide cónico (segmentos ortogonales, longitud 1)', 'FontSize', 12)
+
 
view(40,25)
 
view(40,25)
 
camlight; lighting gouraud
 
camlight; lighting gouraud
 
+
legend('Superficie reglada','Curva \gamma(t)','Segmentos (muestra)','Location','best')
legend({'Superficie reglada','Curva \gamma(t)','Segmentos (muestra)'}, 'Location','best')
+
 
+
 
hold off
 
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  |dhat|=%.6f  dot(dhat,tg)=%.3e\n', ...
 
            t(i), norm(d_hat(i,:)), dot(d_hat(i,:), tg(i,:)));
 
end
 
 
%% Guardar imagen (opcional)
 
% saveas(gcf, 'helicoide_conico_ortogonal.png')
 
 
}}
 
}}
  
Línea 613: Línea 509:
 
   </div>
 
   </div>
 
</div>
 
</div>
 +
 +
=Poster=
 +
[[Archivo:La_Clotoide_póster41.pdf]]
  
 
=Bibliografía=
 
=Bibliografía=

Revisión actual del 14:29 7 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);
kappa = t;

figure
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 [math]P=\gamma(1.5)[/math].

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}\approx 0.6667. [/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]

Evaluando en [math]t=1.5[/math]: [math] \mathbf{n}(1.5)=\left(-\sin\left(\frac{1.5^{2}}{2}\right),\;\cos\left(\frac{1.5^{2}}{2}\right)\right) \approx (-0.90227,\;0.43118). [/math]

El punto de la clotoide es: [math] \gamma(1.5)=\left(\int_{0}^{1.5}\cos\left(\frac{s^{2}}{2}\right)\,ds,\; \int_{0}^{1.5}\sin\left(\frac{s^{2}}{2}\right)\,ds\right) \approx (1.32096,\;0.51365). [/math]

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

Sustituyendo numéricamente: [math] Q \approx (1.32096,\;0.51365) + 0.6667\,(-0.90227,\;0.43118) [/math]

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

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


1.6.1 Dibujo de la circunferencia osculatriz

Circulbueno.jpg
clear; close all; clc

L = 4;
N = 15000;
t = linspace(0,L,N);

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

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

t0 = 1.5;
x0 = interp1(t, x, t0, 'pchip');
y0 = interp1(t, y, t0, 'pchip');

nx = -sin(t0^2/2);
ny =  cos(t0^2/2);

R = 1 / t0;
Cx = x0 + R*nx;
Cy = y0 + R*ny;

theta = linspace(0,2*pi,400);
xc = Cx + R*cos(theta);
yc = Cy + R*sin(theta);

figure('Color','w','Position',[200 200 800 600])
plot(x,y,'k-','LineWidth',1.6), hold on
plot(xc,yc,'r--','LineWidth',1.6)
plot(x0,y0,'bo','MarkerFaceColor','b','MarkerSize',6)
plot(Cx,Cy,'ro','MarkerFaceColor','r','MarkerSize',6)

axis equal, grid on
xlabel('x'), ylabel('y')
title('Clotoide y circunferencia osculatriz en t = 1.5')

% Leyenda en el mismo sitio que antes:
legend('Clotoide','Circunferencia osculatriz','P = \gamma(1.5)','Centro C', ...
       'Location','northeast')

hold off


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
tmin = 2*pi; tmax = 6*pi;
Nt = 800; Nu = 40;
t = linspace(tmin,tmax,Nt).'; 
u = linspace(-0.8,0.8,Nu);

ti = t;
Xg = ti .* cos(ti);
Yg = ti .* sin(ti);
Zg = ti;
gamma = [Xg Yg Zg];

tg = [cos(ti) - ti.*sin(ti), sin(ti) + ti.*cos(ti), ones(Nt,1)];          % tangente (no normalizada)
er = [cos(ti), sin(ti), zeros(Nt,1)];                                     % vector radial en XY

tg2 = sum(tg.^2,2);
proj = ( sum(er.*tg,2) ./ tg2 );                                          % coeficiente de proyección
d = er - proj .* tg;                                                      
d_hat = d ./ vecnorm(d,2,2);

[Ugrid,Tgrid] = meshgrid(u,1:Nt);
X = Xg + Ugrid .* d_hat(:,1);
Y = Yg + Ugrid .* d_hat(:,2);
Z = Zg + Ugrid .* d_hat(:,3);

figure('Color','w')
surf(X,Y,Z,'FaceAlpha',0.88,'EdgeColor','none'), hold on
plot3(Xg,Yg,Zg,'k-','LineWidth',1.8)

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.2)
end

axis equal, grid on
xlabel('x'), ylabel('y'), zlabel('z')
view(40,25)
camlight; lighting gouraud
legend('Superficie reglada','Curva \gamma(t)','Segmentos (muestra)','Location','best')
hold off


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 póster41.pdf

5 Bibliografía

https://moodle.upm.es/

https://images.google.com/

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