Coordenadas Circulares e Arte-Matemática.

Coordenadas Circulares foram definidas pela primeira vez em um livro chamado: The Mathematics Teacher, em 1971. Sua definição é a seguinte: "Consiste em dois eixos perpendiculares, chamados U e V. Cada ponto no eixo é o centro de uma circunferência que passa pela origem. O ponto (u, v) é definido como a interseção de uma circunferência centrada em u no eixo horizontal com outra centrada em v no eixo vertical." Este sistema de coordenadas pouco usual é bastante interessante, pois assíntotas verticais tornam-se pontos no eixo U. Neste notebook estão implementadas algumas funções e curvas neste sistema de coordenadas, as quais acredito que seus gráficos ficam interessantes. A mudança de coordenadas pode ser encontrado no artigo publicado por Elliot A. Tanis and Lee Kuivinen, chamado: Circular Coordinates and Computer Drawn Designs, publicado em: Mathematics Magazine, Vol. 52, No. 3 (May, 1979), pp. 175-178.

Por Gabriel Ribeiro - estudante de graduação em matemática pela UFMG - sob escopo do Projeto Visitas no Mundo da Matemática, 2025.

Copy to clipboard
from math import * import matplotlib.pyplot as plt from scipy.special import * px = 1/plt.rcParams['figure.dpi']

Função Gamma Γ

A função Gamma é uma extensão do fatorial para números não naturais, com o argumento subtraído em 1.

Γ(n1)=n! ou Γ(n)=(n1)!

Essa função pode ser estendida analiticamente a todos os números complexos de parte real positiva por meio da seguinte integral imprópria convergente:

Γ(t)= 0 x t 1 e x dx

A fução Gamma tem caráter extremamente assintótico verticalmente, isso quer dizer que, quando avaliada em uma certa vizinhança de seu domínio, ela varia muitíssimo, crescendo e decrescendo rapidamente. Isso pode ser verificado no gráfico que segue abaixo.

Copy to clipboard
fig, ax = plt.subplots(figsize=(3440*px, 1440*px)) x = np.linspace(-2.999, 9, 2000000) ax.plot(x, gamma(x), color='black', linewidth=0.7) ax.set_ylim(-5, 5) ax.set_xlim(-4, 9) ax.set_aspect('equal', adjustable='box') ax.grid(True, linestyle='--', alpha=0.6) ax.axhline(0, color='black', linewidth=0.5) ax.axvline(0, color='black', linewidth=0.5) plt.show()

png

Em coordenadas esféricas, as assíntotas verticais desaparecem: tornam-se pontos no eixo horizontal. Abaixo, segue o gráfico de uma família de funções Gamma, v=Γ(u)+c,u[2.999,9],c[10,10 ] N

Copy to clipboard
fig, ax = plt.subplots(figsize=(3440*px, 1440*px)) u = np.linspace(-2.999, 9, 2000000) for c in range(-10, 11): v = gamma(u) + c denominator = u**2 + v**2 s = (2 * u * (v**2)) / denominator t = (2 * (u**2) * v) / denominator ax.plot(s, t, color='black', linewidth=0.7) ax.set_aspect('equal', adjustable='box') ax.grid(True, linestyle='--', alpha=0.6) ax.axhline(0, color='black', linewidth=0.5) ax.axvline(0, color='black', linewidth=0.5) plt.show()

png

Função tangente

A função trigonométrica tangente também possui caráter assintótico em várias vizinhanças de seu domínio. Esta, definida por tan(θ)= cos ( θ ) sin ( θ ) possui o seguinte gráfico:

Copy to clipboard
fig, ax = plt.subplots(figsize=(3440 * px, 1440 * px)) u = np.linspace(-4 * pi, 4 * pi, 2000000) v = np.tan(u) ax.plot(u, v, color='black', linewidth=0.7) ax.set_ylim(-12.5, 12.5) ax.set_xlim(-5 * pi, 5 * pi) ax.set_aspect('equal', adjustable='box') ax.grid(True, linestyle='--', alpha=0.6) ax.axhline(0, color='black', linewidth=0.5) ax.axvline(0, color='black', linewidth=0.5) plt.show()

png

Analogamente, podemos evidenciar o desaparecimento das assintotas nesta plotagem de uma família de funções v=tan(u)+c,u[4π,4π],c[10,10 ] N :

Copy to clipboard
fig, ax = plt.subplots(figsize=(3440*px, 1440*px)) u = np.linspace(-4* pi, 4 * pi, 2000000) for c in range(-10, 11): v = np.tan(u) + c denominator = u**2 + v**2 s = (2 * u * (v**2)) / denominator t = (2 * (u**2) * v) / denominator ax.plot(s, t, color='black', linewidth=0.7) ax.set_aspect('equal', adjustable='box') ax.grid(True, linestyle='--', alpha=0.6) ax.axhline(0, color='black', linewidth=0.5) ax.axvline(0, color='black', linewidth=0.5) plt.show()

png

A função afim

A função afim é muitas vezes considerada uma das funções mais simples, ela é definida da seguinte maneira:

f(x)=ax+b

Onde a é a inclinação da reta e b o ponto no qual a reta intercepta o eixo vertical. Aqui, consideraremos a função afim em sua forma mais simples:

f(x)=x

Seu gráfico pode ser observado a seguir:

Copy to clipboard
fig, ax = plt.subplots(figsize=(3440*px, 1440*px)) u = np.linspace(-9, 9, 200000) ax.plot(u, u, color='black', linewidth=0.7) ax.set_aspect('equal', adjustable='box') ax.grid(True, linestyle='--', alpha=0.6) ax.axhline(0, color='black', linewidth=0.5) ax.axvline(0, color='black', linewidth=0.5) plt.show()

png

Essa função não possui assíntotas verticais, no entanto, em coordenadas circulares, podemos observar que, exceto pela função v 0 =u , o ponto onde as outras funções tocariam o eixo vertical vão todos pela origem. Isso é bastante intuitivo haja vista a forma que este sistema de coordenadas foi construído: a circunferência centrada em u centrada na origem possui raio 0, isso faz com que a interseção entre as circunferências vão em direção à origem e, em sua vizinhança, arredondem as retas. Você pode verificar isso no gráfico abaixo.

Copy to clipboard
fig, ax = plt.subplots(figsize=(3440*px, 1440*px)) u = np.linspace(-9, 9, 200000) for c in range(-10, 11): v = u + c denominator = u**2 + v**2 s = (2 * u * (v**2)) / denominator t = (2 * (u**2) * v) / denominator ax.plot(s, t, color='black', linewidth=0.7) ax.set_aspect('equal', adjustable='box') ax.grid(True, linestyle='--', alpha=0.6) ax.axhline(0, color='black', linewidth=0.5) ax.axvline(0, color='black', linewidth=0.5) plt.show()

png

A Função Zeta de Riemann ζ

A função zeta de Riemann, denotada por ζ(s) , é uma função matemática importante na teoria dos números e tem aplicações em outras áreas da matemática e física. Quando tentava obter uma fórmula que permitisse calcular o número de primos menores do que um número dado n , Georg Friedrich Bernhard Riemann (1826-1866) foi conduzido a investigar a série:

ζ(s)= k = 0 1 ns

Hoje conhecida como função zeta de Riemann. Há uma hipótese famosa, a qual nunca foi provada, conhecida como Hipótese de Riemann, de que os zeros não-triviais de ζ tem sempre parte real igual a 1 2 . Com isso em mente, podemos definir uma "linha crítica" de pontos da forma 1 2 +ri , onde r R . Com isso, podemos desenhar o gráfico da Zeta de Riemann para seus zeros não-triviais, dessa forma o eixo horizontal representará a parte real do resultado e o vertical a imaginária. Em termos geométricos, essa linha é importante porque é a única que faz com que a espiral passe pela origem. Isso é importante porque, com essa informação, é possível entender coisas como a frequência dos números primos na reta numérica.

Copy to clipboard
fig, ax = plt.subplots(figsize=(3440*px, 1440*px)) x = np.linspace(0, 50, 2000000) s = 0.5 + 1j * x # '1j' é como o Python representa a unidade imaginária 'i' z = zeta(s) ax.plot(z.real, z.imag, color='black', linewidth=0.7) ax.set_aspect('equal', adjustable='box') ax.set_ylim(-4, 4) ax.set_xlim(-2, 6) ax.grid(True, linestyle='--', alpha=0.6) ax.axhline(0, color='black', linewidth=0.5) ax.axvline(0, color='black', linewidth=0.5) plt.show()

png

Em coordenadas circulares acabamos com uma figura balanceada bastante interessante:

Copy to clipboard
fig, ax = plt.subplots(figsize=(3440*px, 1440*px)) x = np.linspace(0, 500, 200000) s = 0.5 + 1j * x for c in range(-10, 11): z = zeta(s) + c u = z.real v = z.imag denominator = u**2 + v**2 s = (2 * u * (v**2)) / denominator t = (2 * (u**2) * v) / denominator ax.plot(s, t, color='black', linewidth=0.7) ax.set_aspect('equal', adjustable='box') ax.grid(True, linestyle='--', alpha=0.6) ax.axhline(0, color='black', linewidth=0.5) ax.axvline(0, color='black', linewidth=0.5) plt.show()

png

A Espiral Áurea

O dito Número de Ouro, ϕ , recebe este nome por ser uma constante que dita a harmonia entre proporções, a qual aparece de maneira inesperadamente comum na natureza. Para chegar ao número de Ouro, considere um segmento de reta separado em duas partes desiguais (um maior que o outro), a,b , respectivamente. A razão entre o comprimento total a+b e a parte maior a é igual à razão entre a parte maior a e a menor b . Matematicamente:

a + b a = a b

O valor da constante também pode ser obtido resolvendo a equação quadrática:

ϕ2ϕ1=0

Seu valor irracional é: ϕ= 1 + 5 2 1,6180339887

Com isso, podemos produzir a Espiral Áurea: ela é uma espiral logarítmica r=ae b θ onde o raio cresce por um fator ϕ a cada quarto de volta ( π 2 radianos).

Copy to clipboard
phi = (1 + np.sqrt(5)) / 2 b = (2 * np.log(phi)) / np.pi # 'a' é um fator de escala inicial da espiral. a = 0.2 theta = np.linspace(0, 8 * np.pi, 800) r = a * np.exp(b * theta) # Convertendo de coordenadas polares (r, theta) para cartesianas (x, y) para o plot. x = r * np.cos(theta) y = r * np.sin(theta) fig, ax = plt.subplots(figsize=(3440 * px, 1440 * px)) # Plotamos os pontos (x, y) para desenhar a espiral. ax.plot(x, y, color='black', linewidth=2.5) ax.set_aspect('equal') plt.show()

png

Com isso, vamos produzir uma família de 20 espirais áureas rotacionadas.

Copy to clipboard
phi = (1 + np.sqrt(5)) / 2 k = (2 * np.log(phi)) / np.pi a = 0.02 theta = np.linspace(0, 8 * np.pi, 2000000) fig, ax = plt.subplots(figsize=(3440*px, 1440*px)) num_spirals = 20 for i in range(num_spirals): rotation_offset = (2 * np.pi / num_spirals) * i u = a * np.exp(k * theta) * np.cos(theta + rotation_offset) v = a * np.exp(k * theta) * np.sin(theta + rotation_offset) denominator = u**2 + v**2 s = (2 * u * (v**2)) / denominator t = (2 * (u**2) * v) / denominator ax.plot(s, t, color='black', linewidth=0.8) ax.set_aspect('equal', adjustable='box') plt.show()

png

E aqui chegamos ao fim! As coordenadas circulares nos ajudam a visualizar funções de uma maneira não-usual, permitindo-nos gerar belíssimas imagens com curvas suaves, verdadeiras artes matemáticas! Você pode utilizar deste notebook e dos materiais citados nas células anteriores para implementar suas próprias curvas e enviar para projetovisitas@gmail.com, vamos adorar ver suas criações.

Att, Gabriel Ribeiro.