sábado, 21 de marzo de 2015
02:25 am
Me arrepiento de perder la costumbre, si alguna vez la tuve, de escribir con regularidad. Este blog sería como un registro al que podría acudir para auxiliar a mi memoria o analizar mi vida de forma más ordenada. Una libreta de apuntes técnicos de mi vida. Pero siendo honesto conmigo mismo, esa no era la verdadera razón por la que yo escribía. Era y es una necesidad de dejar una huella en este mar de la existencia. Puedo presumir que a mis 24 años he llevado una vida de novela literaria. ¿No es esto un ya buen motivo para escribir sobre ella? Quizá temo palidecer los detalles sobre una mala redacción. But who knows? nunca es tarde para recuperar o construir un hábito.
jueves, 19 de marzo de 2015
Gráfica de un Patrón de Radiación 3D con Python
Para este programa se están utilizando datos obtenidos de una simulación de un dipolo de media onda en HFSS en un archivo csv.
# -*- coding: utf-8 -*-
"""
@author: Rodolfo Escobar
"""
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
data = np.loadtxt('dipolo_16.csv',delimiter=',',skiprows=1)
theta = data[:,0]
phi = data[:,1]
r = data[:,2]
a = 0.0174532925
phi_rad = a*phi;
theta_rad = a*theta;
#Conversión de coordenadas
x = r * np.sin(phi_rad) * np.cos(theta_rad)
y = r * np.sin(phi_rad) * np.sin(theta_rad)
z = r * np.cos(phi_rad);
x = np.reshape(x,(73, 37))
y = np.reshape(y,(73, 37))
z = np.reshape(z,(73,37))
R = np.reshape(r,(73,37))
N = R/R.max()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(x, y, z, rstride=1, cstride=2,facecolors=cm.coolwarm(N),cmap = 'coolwarm',linewidth=0.5 )
surf.set_edgecolor('k')
# Equivalente a la instrucción axis equal en Matlab
max_range = np.array([x.max()-x.min(), y.max()-y.min(), z.max()-z.min()]).max() / 2.0
mean_x = x.mean()
mean_y = y.mean()
mean_z = z.mean()
ax.set_xlim(mean_x - max_range, mean_x + max_range)
ax.set_ylim(mean_y - max_range, mean_y+ max_range)
ax.set_zlim(mean_z - max_range, mean_z + max_range)
#
plt.title(u'Patrón de Radiación')
m = cm.ScalarMappable(cmap=cm.coolwarm)
m.set_array(R)
cbar = fig.colorbar(m,shrink=0.8, aspect=9)
cbar.set_label('dB')
plt.rc('ytick', labelsize=7)
plt.show()
# -*- coding: utf-8 -*-
"""
@author: Rodolfo Escobar
"""
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
data = np.loadtxt('dipolo_16.csv',delimiter=',',skiprows=1)
theta = data[:,0]
phi = data[:,1]
r = data[:,2]
a = 0.0174532925
phi_rad = a*phi;
theta_rad = a*theta;
#Conversión de coordenadas
x = r * np.sin(phi_rad) * np.cos(theta_rad)
y = r * np.sin(phi_rad) * np.sin(theta_rad)
z = r * np.cos(phi_rad);
x = np.reshape(x,(73, 37))
y = np.reshape(y,(73, 37))
z = np.reshape(z,(73,37))
R = np.reshape(r,(73,37))
N = R/R.max()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(x, y, z, rstride=1, cstride=2,facecolors=cm.coolwarm(N),cmap = 'coolwarm',linewidth=0.5 )
surf.set_edgecolor('k')
# Equivalente a la instrucción axis equal en Matlab
max_range = np.array([x.max()-x.min(), y.max()-y.min(), z.max()-z.min()]).max() / 2.0
mean_x = x.mean()
mean_y = y.mean()
mean_z = z.mean()
ax.set_xlim(mean_x - max_range, mean_x + max_range)
ax.set_ylim(mean_y - max_range, mean_y+ max_range)
ax.set_zlim(mean_z - max_range, mean_z + max_range)
#
plt.title(u'Patrón de Radiación')
m = cm.ScalarMappable(cmap=cm.coolwarm)
m.set_array(R)
cbar = fig.colorbar(m,shrink=0.8, aspect=9)
cbar.set_label('dB')
plt.rc('ytick', labelsize=7)
plt.show()
lunes, 16 de marzo de 2015
Graficar una esfera con coordenadas esféricas en Matlab
Una manera de hacer la gráfica de una esfera hueca es primero construir el cascaron como una superficie expresada con coordenadas esféricas y después convertirlas a coordenadas cartesianas con la función sph2cart(). Matlab utiliza la convención alta-azimutal
para coordenadas esféricas por lo que se tiene que considerar a la hora
de traducir funciones expresadas con otras convenciones (por ejemplo, aquellas que miden theta desde el eje Z). En este ejemplo estoy graficando una esfera unitaria centrada en el origen pero pueden modificar el radio multiplicándolo por el valor que deseen y sumando un offset a las coordenadas cartesianas para moverla. Este ejemplo también funciona sin ningún problema en Octave, que es la versión abierta y gratuita de Matlab.
%Esfera de radio unitario en coordenadas esféricas
Az = linspace(0,2*pi,50); %phi
El = linspace(-pi,pi,50); %theta
r = ones(1,50);
%Construcción de malla
[El,Az] = meshgrid(El,Az);
r = meshgrid(r);
%La conversión se realiza después de construir la malla
[X,Y,Z] = sph2cart(Az,El,r);
mesh(X,Y,Z), axis equal
%Esfera de radio unitario en coordenadas esféricas
Az = linspace(0,2*pi,50); %phi
El = linspace(-pi,pi,50); %theta
r = ones(1,50);
%Construcción de malla
[El,Az] = meshgrid(El,Az);
r = meshgrid(r);
%La conversión se realiza después de construir la malla
[X,Y,Z] = sph2cart(Az,El,r);
mesh(X,Y,Z), axis equal
Suscribirse a:
Entradas (Atom)