Brincando com números complexos

Oi

Outro ensaio. Desta vez, vamos brincar com números complexos, com fórmulas e sua visualização.



Idéia


Um número complexo é uma certa extensão de um número real, de fato um vetor para o qual um conjunto inteiro de axiomas é definido. Qualquer número complexo (e, portanto, real) pode ser escrito como z=a+bionde a é a parte real, b é a parte imaginária, i é a raiz da equação x2=1. Muitas operações são definidas para ele, definidas para um número real, por exemplo, z1+z2=a1+a2+(b1+b2)i. Curiosamente, se você fizer várias operações com eles, aumente a potência, multiplique etc. e depois Re(z)(parte real) para o eixo Ox, e Im(z)(parte imaginária) para o eixo Oy, você pode obter imagens engraçadas.

A propósito, eu mesmo criei todas as seguintes fórmulas.

Função de visualização


Rotina. A função, que de acordo com esta função iterativa, desenha tudo no campo:

import random import numpy as np def vis(A, f, step=1.0, c=None): x = [] y = [] for B in np.arange(0, A, step): v = f(A, B) x.append(v.real) y.append(v.imag) plt.figure(figsize=[8, 8]) mxabs = max([i[0] ** 2 + i[1] ** 2 for i in zip(x, y)]) ** 0.5 x = np.array(x) / mxabs y = np.array(y) / mxabs if c is None: plt.scatter(x, y) else: plt.scatter(x, y, color=[c(x[i], y[i]) for i in range(len(x))]) plt.show() 

Todas as nossas funções dependem de dois parâmetros A e B. Além disso, iteramos sobre B dentro de vis (), e A é o parâmetro global da função.

A função Curl


f(A,B)=Bsin(B)eiBcos(A)



Sua declaração em python:

 def func_1(A, B): return math.sin(B) * B * math.e ** (1j * (B * math.cos(A))) 

E corra

 A = 121.5 vis(A, func_1, step=0.1) 

E o resultado para A = 121,5:



E para A = 221,5:



Observe que esses números não decorrem do cálculo de nenhuma integral definida em uma variedade suave e de outras palavras inteligentes que não têm sentido nesse contexto. Estes são números realmente aleatórios, e ainda existe exatamente o infinito de A diferentes, como resultado da qual a beleza é obtida.

Precisa pintar


Declaramos uma função de cor (tal função que retorna uma tupla de três números em coordenadas):

 def sigm(x): #         0  1 return (1 / (1 + 1.2 ** (-x*50)) - 0.5) * 2 color_1 = lambda x, y: (0.2, sigm(x ** 2 + y ** 2) / 1.4, 1 - sigm(x ** 2 + y ** 2)) color_2 = lambda x, y: (sigm(x ** 2 + y ** 2), 0.5, 0.5) 

Escolha o parâmetro aleatório A, seja 149:

 vis(149, func_1, step=0.1, c=color_1) 



Função Gansos


Os gansos são descritos da seguinte forma:

f(A,B)=cos(B)sen(B)BeiBcos(A)


Declaração Python:

 def func_2(A, B): return math.cos(B) * math.sin(B) * B * math.e ** (1j * (B * math.cos(A))) 

Seu resultado para A = 106:



Função fococcia


f(A,B)=cos(B(A+1))eiBcos(A)



 def func_3(A, B): return math.cos((A + 1) * B) * math.e ** (1j * (B * math.cos(A))) 

 vis(246, func_3, step=0.1, c=color_2) 



 vis(246, func_3, step=0.1, c=color_2) 



Função sem título


f(A,B)=Bsin(A+B)eiBsin(A)


 color_3 = lambda x, y: (0.5, 0.5, sigm(x ** 2 + y ** 2)) vis(162, func_4, step=0.1, c=color_3) 



 vis(179, func_4, step=0.1, c=color_3) 



Fórmula de beleza


f(A,B)=cos(B(A+1)) frac32eiBcos(A)



 def func_5(A, B): return math.cos((A + 1) * B) ** 1.5 * math.e ** (1j * (B * math.cos(A))) 

 color_4 = lambda x, y: (sigm(x ** 2 + y ** 2) / 2, 0.5, 1 - sigm(x ** 2 + y ** 2)) vis(345, func_5, step=0.1, c=color_4) 



 vis(350, func_5, step=0.1, c=color_4) 



Por enquanto é tudo.

Código inteiro
 import numpy as np import random import matplotlib.pyplot as plt import math def vis(A, f, step=1.0, c=None): x = [] y = [] for B in np.arange(0, A, step): v = f(A, B) x.append(v.real) y.append(v.imag) plt.figure(figsize=[7, 7]) mxabs = max([i[0] ** 2 + i[1] ** 2 for i in zip(x, y)]) ** 0.5 x = np.array(x) / mxabs y = np.array(y) / mxabs if c is None: plt.scatter(x, y) else: plt.scatter(x, y, color=[c(x[i], y[i]) for i in range(len(x))]) plt.show() def func_1(A, B): return math.sin(B) * B * math.e ** (1j * (B * math.cos(A))) def func_2(A, B): return math.cos(B) * math.sin(B) * B * math.e ** (1j * (B * math.cos(A))) def func_3(A, B): return math.cos((A + 1) * B) * math.e ** (1j * (B * math.cos(A))) def func_4(A, B): return math.sin(A + B) * B * math.e ** (1j * B * math.sin(A)) def func_5(A, B): return math.cos((A + 1) * B) ** 1.5 * math.e ** (1j * (B * math.cos(A))) def sigm(x): return (1 / (1 + 1.2 ** (-x*50)) - 0.5) * 2 color_1 = lambda x, y: (0.2, sigm(x ** 2 + y ** 2) / 1.4, 1 - sigm(x ** 2 + y ** 2)) color_2 = lambda x, y: (sigm(x ** 2 + y ** 2), 0.5, 0.5) color_3 = lambda x, y: (0.5, 0.5, sigm(x ** 2 + y ** 2)) color_4 = lambda x, y: (sigm(x ** 2 + y ** 2) / 2, 0.5, 1 - sigm(x ** 2 + y ** 2)) colors = [color_1, color_2, color_3, color_4] funcs = [func_1, func_2, func_3, func_4, func_5] while True: col = random.choice(colors) func = random.choice(funcs) vis(random.random() * 200 + 100, func, step=0.1, c=col) if input() == "exit": break 


Mais capturas de tela


















Source: https://habr.com/ru/post/pt468781/


All Articles