Reta normal

Não, não se trata de um desses problemas aguardando soluções ou de um exercício de algum livro-texto de cálculo.
Há pouco mais de 7 meses eu tive a ideia de escrever um texto com uma lista de trechos de códigos para Mathematica que fossem úteis principalmente para verificar respostas de exercícios de cálculo de várias variáveis, além de talvez servirem para facilitar a visão geométrica de certas situações.
Pois bem! A coisa é que eu não tenho familiaridade com o Mathematica e acabou sendo meio trabalhoso demais fazer o que eu tinha em mente – apesar de eu ter me esforçado e ter chegado ao ponto de tirar alguns prints e começar a escrever o rascunho do tal texto

imagem

Mas o semestre avançava e a ideia legal passava a ser praticamente uma necessidade. Quase nunca eu me convencia completamente das respostas de alguns exercícios e quando isso acontecia era frequente eu não ter ideia do significado geométrico da solução.
Então decidi apelar: uma semana antes da semana de uma prova delicadíssima eu tive uma ideia de um programa simpático para desenhar pelo menos algumas curvas de níveis. Sabia que a matplotlib tem umas funções 3D, então escrevi uns 3 scripts separados, um pra curvas de níveis, outro pra curvas parametrizadas e outro pra gráficos mesmo.

A coisa é que estava tudo muito rústico. Eu tinha que inserir a função manualmente no código toda hora, controlar os parâmetros toda hora e por aí vai. Então na semana da prova (faço questão de situar a coisa no tempo porque foi uma decisão muito periculosa) eu faltei, acordei bem cedo e fiquei tentando escrever uma coisa razoavelmente unificada.
Digamos que deu certo

Captura de tela de 2016-02-06 21:44:50

Está meio desajeitadão, feio, talvez bobo e chato, mas usei durante todo o semestre passado e preparação para a prova de recuperação posso dizer que tem funcionado bem. Basicamente eu combinei PyQt4, matplotlib, numpy e sympy para escrever um programa bem simples que lê equações que usam as funções matemáticas da numpy (perceba o “np.log” ali na equação no lugar de “ln”) para gerar gráficos, curvas de níveis e (idealmente) planos tangentes e retas normais.

Mas como tudo na vida, meu programa apresentou problemas. Bem, a menos que eu esteja completamente louco os pontos (x,y,z) que satisfazem

ax+by+cz+d=0

descrevem um plano cujo vetor normal é paralelo a (a,b,c). Mesmo que eu estivesse louco, os livros de cálculo de várias variáveis que não usam a abordagem da álgebra linear geralmente têm em algum lugar, devidamente destacado, que a equação do plano tangente ao ponto (x_0,y_0,f(x_0,y_0)) da função f(x,y) pode ser escrita como

z-f(x_0,y_0)=\frac{\partial f}{\partial x}(x_0,y_0)(x - x_0)+\frac{\partial f}{\partial y}(x_0,y_0)(y - y_0)

De modo que o vetor normal a esse plano seria

\vec{n}=(\frac{\partial f}{\partial x}(x_0,y_0), \frac{\partial f}{\partial y}(x_0,y_0), -1)

Então a equação vetorial da reta normal a esse plano seria

(x,y,z)=(x_0,y_0,f(x_0,y_0))+\lambda(\frac{\partial f}{\partial x}(x_0,y_0), \frac{\partial f}{\partial y}(x_0,y_0), -1)

onde \lambda é um real. Porém, contudo, entretanto, todavia… Eu simplesmente não consigo fazer isso dar certo! Ou melhor (!) não consigo enxergar isso dando certo!

wayne-computerNão importa o que eu faça, a reta normal nunca parece fazer 90 graus com o maldito plano!
Esse problema surgiu no dia que eu escrevi o código, mas como a prova era naquela semana eu deixei pra lá. Depois que passou a prova eu estava tão complicado em cálculo que eu esqueci todos os problemas da minha vida, mas hoje eu lembre disso e tentei finalizar o programa, só que parece ser impossível!
Eu testei a coisa de diversas maneiras. Usei todas as relações conhecidas da geometria analítica pra me certificar que ao menos analiticamente a reta de fato é a reta normal ao plano, mas parece que meus sentidos estão me enganando.
Talvez seja uma versão matemática daquele vestido azul pra algumas pessoas, dourado pra outras.

Esquecendo um pouco as burocracias da linguagem, veja esse trecho do código onde eu tento representar o plano x+2y+3z+4=0 e uma reta normal a ele


# PLANO
xMIN = -10
xMAX = 10
yMIN = -10
yMAX = 10
points = 50

x = np.linspace(xMIN, xMAX, points)
y = np.linspace(yMIN, yMAX, points)
x,y = np.meshgrid(x,y)
z = (1/3)*(-4 - x - 2*y)

surface = ax.plot_surface(x, y, z, rstride=2, cstride=2, cmap=cm.hsv, alpha=0.5)
fig.colorbar(surface, shrink=0.5, aspect=10)

# RETA
theta = np.linspace(-10,10,100)
a = 1
b = 2
c = 3

zz = 0 + c*theta
yy = 0 + b*theta
xx = -4 + a*theta

ax.plot(xx, yy, zz)

E o resultado (com algumas coisinhas a mais)

figure_1

Não importa o quanto eu abra meu coração, a reta azul não parece ser normal ao plano. Acrescentei o segmento verde, “dobro” do vetor normal, pra comparar com a reta. Acrescentei o segmento vermelho ligando os dois pontos de intersecção dos segmentos no plano para ter certeza que ambos estão contidos no plano e além disso tratei ambos os segmentos, verde e vermelho, como vetores e calculei o produto escalar e adivinha? Zero!

No momento eu não faço a menor ideia do que fazer, mas ainda não estou tão desesperado a ponto de perguntar pra alguém do Stack Exchange Overflow, mas estou registrando esse problema como um sinal de não-desistência.

image2.png
O plano tangente ao ponto (2.5, 2.5) parece estar correto, mas o que diabos é essa reta normal?!

UPDATE (27 de maio de 2017, sábado)

Curiosamente, estava eu na página de estatísticas do blog; a partir de lá fui visitar uma outra página, caí aqui sem querer, dei uns scrolls down e enxerguei o erro: os eixos!

house_epiphany

Os eixos não estão com a mesma escala, digamos, então claro que qualquer coisa que deveria parecer uma reta vai ficar deformada! Uma pequena gambiarra correção no código já produz

Pelo fato de ter feito uma verdadeira gambiarra, acabou que fiquei meio sem muita opção de curvas e intervalos pra mostrar que dá certo, mas se feito direitinho tudo vai ficar legal.

Considero resolvido “o problema da reta normal“, mas algum dia trarei a versão final do código.

Anúncios

Comentário:

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s