''' Fecha: 15/03/25 Codigo definitivo para la interpolacion de datos en coordenadas esfericas (polares) --> El metodo de ajuste devuelve datos equiespaciados (por tanto no hay que proyectar constantemente) --> Se aƱade un punto al final y principio, esto siempre mejora la precision del metodo porque es una condicion necesaria (alpha = 2pi + alpha) NOTA: Este codigo ignora los 0's por tanto es compatible con filtroz, porque ademas se encarga de ordenar ascendentemente phi ''' import numpy as np from scipy.interpolate import PchipInterpolator def newinterpolate2(matrizsph,n): tiempo = matrizsph.shape[0] MSph = np.empty((tiempo,n,3)) # OBJETIVO theta = np.zeros(n) + np.pi/2 MSph[:,:,1] = theta for t in range(tiempo): frame = matrizsph[t] mask = ~np.all(frame == 0, axis=1) # seleccionamos valores distintos de 0 frame = frame[mask] if frame.shape[0] < 2: raise ValueError(f"No hay suficientes puntos para interpolar en el tiempo {t}.") x = frame[:,2] # esto es phi y = frame[:,0] # esto es r indices_ordenados = np.argsort(x) x = x[indices_ordenados] # ordenados ascendentemente y = y[indices_ordenados] x = np.concatenate(([x[-1] - 2*np.pi], x, [x[0] + 2*np.pi])) y = np.concatenate(([y[-1]], y, [y[0]])) interp = PchipInterpolator(x, y) #x_new = np.linspace(0, 2*np.pi, n) # 500 puntos en el intervalo de x EQUIESPACIADO x_new = np.linspace(0, 2*np.pi, n,endpoint = False) # 500 puntos en el intervalo de x EQUIESPACIADO y_new = interp(x_new) MSph[t,:,2] = x_new # phi MSph[t,:,0] = y_new # r(phi) return MSph