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 dotentre 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() ```

png

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() ```

png

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() ```

png