Curvatura de uma curva
python
import sympy as sp
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
Curvatura
Seja uma curva parametrizada pelo comprimeto de arco. Definimos curvatura como a função . Essa definição é consistente com o que esperávamos de uma reta (curvatura nula) e de um círculo (curvatura constante e inversamente proporcional ao raio). Além disso, se é uma curva regular qualquer, ela tem uma reparametrização pelo comprimento de arco. Portanto, podemos definir a sua curvatura como sendo a curvatura de sua reparametrização pelo comprimento de arco. Isto é, seja uma reparametrização pelo comprimento de arco de com curvatura . Então a curvatura de será .
Uma questão que se levanta é: e se houver outra reparametrização pelo comprimento de arco para ? Para isso, precisamos mostrar que a curvatura é invariante (não muda) segundo a reparametrização. Isso não é dificíl de ver, pois as tangentes das reparametrizações têm mesmo tamanho e, possivelmente, diferentes sinal.
Curvatura de uma curva regular
Seja uma curva em , então sua curvatura é dada pela expressão
Observe que para curvas no plano essa expressão pode também ser utilizada,
Curvatura com sinal
Definimos a normal unitária com sinal o vetor unitário que rotaciona o vetor tangente no sentido anti-horário em . Em particular, e são perpendiculares (pois a curva é parametrizada pelo comprimento de arco) e, portanto, é paralelo a , e assim
Chamamos de curvatura com sinal. Em particular, .
Função Ângulo
Dada uma curva diferenciável , onde é o círculo centrado na origem, dizemos que é função ângulo de quando
Observe que nessa definição, a imagem de é um subconjunto de , como se fosse um arco. Por exemplo,
.
Considere o operador que rotaciona no sentido anti-horário em 90° um vetor. Podemos descrevê-lo em forma matricial como
Defina o determinante entre dois vetores como
que é o produto interno do vetor rotacionado e .
Diferenciabilidade
Seja uma curva diferenciável. Então admite uma função ângulo diferenciável. Além disso, se é função ângulo diferenciável de , ela difere de por uma constante.
Note que supondo a existência dessa função diferenciável, temos que, por aplicação da Regra da Cadeia, Portanto, aplicando o produto interno em ambos os lados, observamos que Assim, a demonstração se dá defininido com essa derivada (Teorema Fundamental do Cálculo).
Agora seja uma curva regular, sem perda de generalidade, parametrizada pelo comprimento de arco. Seja . Como , pela proposição anterior, existe uma função ângulo diferenciável de forma que definimos a curvatura de como
Observação 1: Se é regular, sua curvatura é
Observação 2: Estamos rotacionando o vetor tangente, obtendo o que chamamos de vetor normal unitário e fazendo o produto interno com a aceleração da curva, o que coincide com a definição prévia!
Exemplo: Considere a parametrização do círculo . Assim
Exemplo 2: Vamos usar python para calcular a curvatura da espiral equiangular onde é uma constante e .
```python
Definimos as variáveis
t = sp.symbols('t', real = True) a = sp.symbols('a', real = True, constant = True)
Definimos a função z
z = sp.exp((a + sp.I)*t)
Derivando
zt = sp.diff(z, t) ztt = sp.diff(zt, t)
Rotaciona zt
Jzt = ztsp.exp(sp.Isp.pi/2) ```
Observe que nossa curva está definida no plano complexo (isomorfo ao plano real). Para calcular a curvatura de uma curva, rotacionamos o vetor e fazemos o produto dot
entre esses números como produto escalar de dois vetores. Nesse caso, teremos que .
python
k = sp.re(Jzt*sp.conjugate(ztt))/sp.Abs(zt)**3
k
Precisamos indicar para o programa que queremos uma resposta fatorizada
python
k = sp.factor(k)
k
Assim, essa é a curvatura da espiral equiangular.
Movimento Rígido
Isometria: Uma aplicação que preserva distância, isto é, . Diremos uma movimento rígido é uma isometria (a rigidez em mudar distâncias).
Translação: Uma aplicação do tipo , para algum fixo.
Transformação Ortogonal: Uma transformação linear que presetva o produto interno, isto é, . A matriz associada a essa transformação é ortogonal.
Dizemos que o movimento é direto se e oposto ou inverso quando .
Teorema
Seja uma matriz ortogonal e . Então definido como é uma isometria. Reciprocamente, toda isometria pode ser escrito nessa forma. Esse teorema permite uma caracterização simples de um movimento rígido.
Invariância da curvatura
Sejam um movimento rígido direto de e uma curva regular parametrizada por comprimento de arco. Então, é uma curva regular de , parametrizada por comprimento de arco, cuja função curvatura coincide com a de , isto é, .
Observe que derivar o que garante que é parametrizada pelo comprimento de arco e que . Portanto, como , vale que as curvaturas são as mesmas.
Equações de Frenet
Seja uma curva parametrizada pelo compimento de arco com vetor normal e vetor tangente . Observe que para cada , esses vetores formam um base ortonormal para . Chamamos essa base de diedro de Frenet. Já definimos curvatura com sinal quando . Além disso, . Portanto é paralelo a . Logo e:
Assim obtemos as equações de Frenet:
As equações de Frenet são, portanto, um sistema de equações diferenciais envolvendo a base ortonormal para cada .
Teorema Fundamental das Curvas no Plano
Sejam um intervalo aberto e uma função diferenciável. Então, existe uma curva diferenciável, , parametrizada por comprimento de arco, cuja função curvatura coincide com . Além disso, para toda curva , parametrizada por comprimento de arco, que cumpre , existe um movimento rígido , tal que .
Exemplo: (Reconstrução de uma curva plana) Suponha que nos é dado uma curvatura . Como e . Vamos supor que o intervalo é do tipo , onde é o comprimento da curva.
```python def get_curve_from_curvature(k, tf, x0, y0): # ângulo theta_ = solve_ivp(fun = k, t_span = (0,tf), y0 = [0], t_eval = np.arange(0,tf+1e-4,0.01) ).y[0]
def theta(t):
li = int(t*(len(theta_)-1)/tf)
gi = min(int(t*(len(theta_)-1)/tf) + 1, len(theta_)-1)
convex = t*len(theta_)/tf - li
return (1-convex)*theta_[li] + convex*theta_[gi]
# Componentes
def f(t,x):
return [np.cos(theta(t)), np.sin(theta(t))]
# Curva
alpha = solve_ivp(fun = f,
t_span = (0,tf),
y0 = [x0,y0],
t_eval = np.arange(0,tf+1e-4,0.01)
).y
return alpha
```
Círculo
```python
Curvatura
k = lambda t,x: 1
Um ponto em que passa a curva
x0 = 0 y0 = 0
Comprimento da curva
tf = 2*np.pi+0.1
alpha = get_curve_from_curvature(k,tf,x0,y0)
plt.figure(figsize = (6,6)) plt.plot(alpha[0,:], alpha[1,:]) plt.show() ```
Reta
```python
Curvatura
k = lambda t,x: 0
Um ponto em que passa a curva
x0 = 0 y0 = 0
Comprimento da curva
tf = 10*np.pi+0.1
alpha = get_curve_from_curvature(k,tf,x0,y0)
plt.figure(figsize = (6,6)) plt.plot(alpha[0,:], alpha[1,:]) plt.show() ```
Clotoide
```python
Curvatura
k = lambda t,x: t
Um ponto em que passa a curva
x0 = 0 y0 = 0
Comprimento da curva
tf = 10*np.pi+0.1
alpha = get_curve_from_curvature(k,tf,x0,y0)
plt.figure(figsize = (6,6)) plt.plot(alpha[0,:], alpha[1,:]) plt.show() ```