Anterior
Índice
Seguinte

Geometria: Tubos Abraçando Curvas Espaciais


Resumo do exemplo:

Para uma curva arbitrária no espaço tridimensional, usamos fórmulas de Frenet para calcular um tubo abraçando aquela curva. Um tubo abraçando uma curva é uma superfície no espaço; uma superfície no espaço é convenientemente representada por um vetor de três funções

 [ fx(u, v), fy(u, v), fz(u, v)]

onde u, v são parâmetros.

Para calcular um tubo abraçando uma curva, precisamos da nomal e da binormal paa todo o ponto da curva. Esses vetores são obtidos através das fórmulas de Frenet:

A tangente:

      g'
t = ----
|g'|

The binormal:

      g' × g"
b = ---------
|g' × g"|

A normal normal:

 n = b × t

Nessas fórmulas, o "x"multiplicativo quer dizer produto vetorial entre dois vetores espaciais. Note que g é uma função de um parâmetro; por conseqüência os vetores  t, b, n são também funções daquele mesmo parâmetro.

Com esses vetores, um tubo abraçando uma curva é facilmente definido:

tube(g, r, u, v) :=
g(u) + r*(cos(v)*n(u) + sin(v)*b(u))

onde r é o raio do tubo, u é o parâmetro da curva espacial e v é um parâmetro que percorre de 0 a 2*pi.

Note que para o tubo precisamos somente a normal e a binormal. Todavia precisamos de todas as fórmulas de Frenet: A tamgente é necessária para calcular a normal.

Iremos precisar do produto vetorial de dois vetores umas poucas vezes, então vamos começar com uma definição para isso:

cross (v1, v2) := determinant(matrix([[1, 0, 0], [0, 1, 0], [0, 0,1]], v1, v2));

Aqui está um exemplo:

 cross([12, -1, 3], [-9, -2, -2]);
[8, - 3, - 33]

Umartifício de definição completo é esse:

Primeiro definimos uma função para rotacionar os elementos da lista uma posição para a esquerda. Aqui usamos  nosso conhecimento de Lisp para escrever:

  (DEFUN rotateLeft
(Lambda (V) (APPEND (CDR V) (LIST (CAR V))))
)

Traduzido para Maxima, torna-se:

rotateLeft(v1):= append(rest(v1, 1), cons(first(v1), []));

Agora vamos ao artifício:

cross (u, v) := rotateLeft( u * rotateLeft(v) - v * rotateLeft(u));

Testemos esse artifício com dois vetores genéricos:

 cross([ax, ay, az], [bx, by, bz]);
[ay bz - az by, az bx - ax bz, ax by - ay bx]

Essa é de fato a fórmula que encontramos em todo livro didático sobre geometria analítica.

Agora usamos as fórmulas de Frenet para calcular a tangente, a normal e a binormal para um ponto arbitrário da curva espacial:

A tangente:

tangent(fn, x) :=
diff(fn(x), x) / ((diff(fn(x), x) . diff(fn (x), x))^(1/2))$

A binormal:

binormal (fn, x) := 
cross (diff(fn(x), x),
diff (fn(x), x, 2)
)
/(( cross(diff(fn(x), x), diff (fn(x), x, 2))
. cross(diff(fn(x), x), diff (fn(x), x, 2))
) ^(1/2)
)$

E a normal:

normal (fn, x) := cross(binormal(fn, x), tangent(fn, x))$

Par construir um tubo, usamos o vetor normal e o vetor binormal para traçar um círculo em torno de um ponto da curva:

 tube(fn, r, t, phi) :=
fn(t) + r* (cos(phi)* normal(fn, t) + sin(phi)* binormal(fn, t))$

Você pode encontrar essas definições em tubeplot1.mc.

Agora vamos testar essas definições com uma curva espacial muito bonita: uma hélice.

helix(x) := [5*cos(x), 5*sin(x), 3*x];

Maxima responde a definição:

 helix(x) := [5 cos(x), 5 sin(x), 3 x]

A definição é fácil de entender:

[5*cos(x), 5*sin(x)]

é um círculo de raio 5.
A terceira coordenada
3*x

translada os pontos do círculo no espaço. A distância de translação para uma volta completa de um pointo sobre o círculo é 2*pi*3.

Agora podemos testar nossas definições.

tangent(helix, t);
		      5 sin(t)
(%o14) [- ---------------------------------,
2 2
sqrt(25 sin (t) + 25 cos (t) + 9)

5 cos(t) 3
---------------------------------, ---------------------------------]
2 2 2 2
sqrt(25 sin (t) + 25 cos (t) + 9) sqrt(25 sin (t) + 25 cos (t) + 9)
binormal (helix, t);
				 15 sin(t)
(%o15) [------------------------------------------------------------,
2 2 2 2 2
sqrt((25 sin (t) + 25 cos (t)) + 225 sin (t) + 225 cos (t))

15 cos(t)
- ------------------------------------------------------------,
2 2 2 2 2
sqrt((25 sin (t) + 25 cos (t)) + 225 sin (t) + 225 cos (t))

2 2
25 sin (t) + 25 cos (t)
------------------------------------------------------------]
2 2 2 2 2
sqrt((25 sin (t) + 25 cos (t)) + 225 sin (t) + 225 cos (t))
(%i13) normal(helix, t);
			  2	       2
(%o16) [- 5 cos(t) (25 sin (t) + 25 cos (t))

2 2 2 2 2
/(sqrt(25 sin (t) + 25 cos (t) + 9) sqrt((25 sin (t) + 25 cos (t))

2 2
+ 225 sin (t) + 225 cos (t))) - 45 cos(t)

2 2 2 2 2
/(sqrt(25 sin (t) + 25 cos (t) + 9) sqrt((25 sin (t) + 25 cos (t))

2 2 2 2
+ 225 sin (t) + 225 cos (t))), - 5 sin(t) (25 sin (t) + 25 cos (t))

2 2 2 2 2
/(sqrt(25 sin (t) + 25 cos (t) + 9) sqrt((25 sin (t) + 25 cos (t))

2 2
+ 225 sin (t) + 225 cos (t))) - 45 sin(t)

2 2 2 2 2
/(sqrt(25 sin (t) + 25 cos (t) + 9) sqrt((25 sin (t) + 25 cos (t))

2 2
+ 225 sin (t) + 225 cos (t))), 0]

Quando tentamos

tube(helix, 1, t, rho);

Recebemos uma página cheia de expressões não simplificadas.

O problema óbvio é que essas expressões não foram simplificadas. Ess não é o caminho correto para fazer omputação simbólica. Precisamos ter cuidado com simplificações e, como regra geral, podemos simplificar uma expressão tão breve quanto possível.

Para esse exemplo, simplificação pode ser facilmente encontrada com a função trigsimp:

trigsimp(tangent(helix, t));
			    5 sin(t)  5 cos(t)	   3
[- --------, --------, --------]
sqrt(34) sqrt(34) sqrt(34)
trigsimp(binormal(helix, t));
			3 sin(t)    3 cos(t)	 5
(%o18) [--------, - --------, --------]
sqrt(34) sqrt(34) sqrt(34)
trigsimp(normal(helix, t));
  [- cos(t), - sin(t), 0]

Nesse exemplo, simplificação trigonométrica foi duplamente útil e necessária. Vamos examinar uma curva espacial diferente antes de desenhar nossas conclusões sobre definições melhoradas para as dunções tangent, binormal, normal.

w(x) := [2*t^2 - t, t^2, 2*t^2 + 4*t];
				  2	  2     2
(%o8) w(x) := [2 t - t, t , 2 t + 4 t]
tg: tangent(w, t);
		     4 t - 1
(%o9) [------------------------------------,
2 2 2
sqrt((4 t + 4) + (4 t - 1) + 4 t )

2 t 4 t + 4
------------------------------------, ------------------------------------]
2 2 2 2 2 2
sqrt((4 t + 4) + (4 t - 1) + 4 t ) sqrt((4 t + 4) + (4 t - 1) + 4 t )

É óbvio que simplificação trigonométrica não ajudará aqui,mas é igualmente óbvio que todos os três denominadores podem ser simplificados. Tentemos radcan, que é muitas vezes útil para reescrever radicais na forma canônica:

radcan(tg);
		4 t - 1			   2 t
(%o10) [-----------------------, -----------------------,
2 2
sqrt(36 t + 24 t + 17) sqrt(36 t + 24 t + 17)

4 t + 4
-----------------------]
2
sqrt(36 t + 24 t + 17)

Isso parece um pouco melhor.

para a binormal e a normal obtemos:

bn: binormal(w, t);
							    2
(%o11) [(8 t - 2 (4 t + 4))/sqrt((4 (4 t + 4) - 4 (4 t - 1))

2 2
+ (8 t - 2 (4 t + 4)) + (2 (4 t - 1) - 8 t) ),

2
(4 (4 t + 4) - 4 (4 t - 1))/sqrt((4 (4 t + 4) - 4 (4 t - 1))

2 2
+ (8 t - 2 (4 t + 4)) + (2 (4 t - 1) - 8 t) ),

2 2
(2 (4 t - 1) - 8 t)/sqrt((4 (4 t + 4) - 4 (4 t - 1)) + (8 t - 2 (4 t + 4))

2
+ (2 (4 t - 1) - 8 t) )]
radcan(bn);
			  4	      10	    1
(%o12) [- ----------, ----------, - ----------]
3 sqrt(13) 3 sqrt(13) 3 sqrt(13)
nm: normal(w, t);
(%o13) [(4 t + 4) (4 (4 t + 4) - 4 (4 t - 1))

2 2 2 2
/(sqrt((4 t + 4) + (4 t - 1) + 4 t ) sqrt((4 (4 t + 4) - 4 (4 t - 1))

2 2
+ (8 t - 2 (4 t + 4)) + (2 (4 t - 1) - 8 t) ))

2 2 2
- 2 t (2 (4 t - 1) - 8 t)/(sqrt((4 t + 4) + (4 t - 1) + 4 t )

2 2
sqrt((4 (4 t + 4) - 4 (4 t - 1)) + (8 t - 2 (4 t + 4))

2
+ (2 (4 t - 1) - 8 t) )), (4 t - 1) (2 (4 t - 1) - 8 t)

2 2 2 2
/(sqrt((4 t + 4) + (4 t - 1) + 4 t ) sqrt((4 (4 t + 4) - 4 (4 t - 1))

2 2
+ (8 t - 2 (4 t + 4)) + (2 (4 t - 1) - 8 t) ))

2 2 2
- (4 t + 4) (8 t - 2 (4 t + 4))/(sqrt((4 t + 4) + (4 t - 1) + 4 t )

2 2
sqrt((4 (4 t + 4) - 4 (4 t - 1)) + (8 t - 2 (4 t + 4))

2
+ (2 (4 t - 1) - 8 t) )), 2 t (8 t - 2 (4 t + 4))

2 2 2 2
/(sqrt((4 t + 4) + (4 t - 1) + 4 t ) sqrt((4 (4 t + 4) - 4 (4 t - 1))

2 2
+ (8 t - 2 (4 t + 4)) + (2 (4 t - 1) - 8 t) ))

- (4 t - 1) (4 (4 t + 4) - 4 (4 t - 1))

2 2 2 2
/(sqrt((4 t + 4) + (4 t - 1) + 4 t ) sqrt((4 (4 t + 4) - 4 (4 t - 1))

2 2
+ (8 t - 2 (4 t + 4)) + (2 (4 t - 1) - 8 t) ))]
radcan(nm);
					       2
(42 sqrt(13) t + 40 sqrt(13)) sqrt(36 t + 24 t + 17)
(%o14) [-----------------------------------------------------,
2
1404 t + 936 t + 663

2
(12 sqrt(13) t + 17 sqrt(13)) sqrt(36 t + 24 t + 17)
-----------------------------------------------------,
2
1404 t + 936 t + 663

2
(48 sqrt(13) t - 10 sqrt(13)) sqrt(36 t + 24 t + 17)
- -----------------------------------------------------]
2
1404 t + 936 t + 663

Agora vamos tentar melhorar as definições de tangent, normal, binormal:

Podemos assumir que para expressões que contiverem funções trigonométricas ambos o produto escalar e o produto vetorial irão freqüêntemente retornar expressões que possuem expoentes de funções trigonométricas. É portanto uma boa idéia aplicar trigsimp a esses resultados.

Aqui estão as novas definições:

tangent(fn, x) :=
diff(fn(x), x) / radcan (trigsimp((diff(fn(x), x) . diff(fn (x), x)))^(1/2))$
binormal (fn, x) := 
trigsimp(cross (diff(fn(x), x),
diff (fn(x), x, 2)
)
) /
radcan
(trigsimp(
( cross(diff(fn(x), x), diff (fn(x), x, 2)) . cross(diff(fn(x), x), diff (fn(x), x, 2)) ) ^(1/2) ) )$
normal (fn, x) := radcan (trigsimp(cross(binormal(fn, x), tangent(fn, x))))$

Você encontrará essas definições em tubeplot2.mc.

With these definitions, we obtain reasonably well simplified results.

O que aprendemos:



Anterior
Índice
Seguinte