import random
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
def show_3d(domain,function,title):
# preparing
fig = plt.figure()
fig.suptitle(title, fontsize=18, fontweight='bold')
ax = Axes3D(fig)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# data
X = np.arange(domain[0], domain[1], 0.15)
Y = np.arange(domain[0], domain[1], 0.15)
X, Y = np.meshgrid(X, Y)
Z = function(X,Y)
# rendering
ax.plot_surface(X, Y, Z, rstride=1,cstride=1,cmap=cm.jet)
ax.legend()
plt.show()
# -- Problem
DOMAIN_DJ_1 = [-5,5]
def dejong_1_a(x,y):
return x ** 2 + y ** 2
if __name__ == '__main__':
show_3d(DOMAIN_DJ_1,dejong_1_a, 'Sphere')
Ao executar o código obtemos a figura retratada na imagem. Podemos verificar a existência de 4 máximos nas extremidades do domínio.

Em termos de código, e em alternativa, podemos recorrer a linspace em vez de arange. A diferença entre ambas, é que no caso da primeira dizemos quantos pontos queremos igualmente espaçados entre os limites inferior e superior.
def show_3d_b(domain,function,title):
# preparing
fig = plt.figure()
fig.suptitle(title, fontsize=18, fontweight='bold')
ax = Axes3D(fig)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# data
X = np.linspace(-5,5,50)
Y = np.linspace(-5,5,50)
X, Y = np.meshgrid(X, Y)
Z = function(X,Y)
# rendering
ax.plot_surface(X, Y, Z, rstride=1,cstride=1,cmap=cm.jet)
ax.legend()
plt.show()
Na aula propus duas variantes à função Sphere. Uma primeira em que alteramos a sua segunda componente, ficando agora a função a ser:
def dejong_1_b(x,y):
return x ** 2 + y ** 3
Visualmente fica:

Uma alteração aparentemente menor modifica bastante o resultado final.
Uma segunda em que introduzimos ruído gaussiano:
def dejong_1_c(x,y):
noise = np.array([random.gauss(0,3) for i in range(len(x))])
return (x ** 2 + y ** 2) + noise
De novo mostramos a imagem. Neste caso o valor do ruído acrescentado altera a imagem obtida.

Sem comentários:
Enviar um comentário