Usando Python, no sé cómo calcular el esquema Lax de segundo orden de la función dada con velocidad no constante en esta función de densidad.
He intentado codificar esto con velocidad constante pero estoy confundido de cómo hacerlo con la velocidad dada como v=10+x:
Aquí está mi código para velocidad constante:
import numpy as np
import matplotlib.pyplot as plt
# número de iteraciones
MaxIter = 800
# número de puntos
Nx = 1000
# velocidad de propagación
c = 10.0
xmin = 0.0
xmax = 100
v = 0.2
dx = (xmax - xmin) / Nx
dt = (v/c) * dx
# inicializando una matriz 2D para actualizar los resultados
oldL = np.concatenate((np.zeros(100), [1.0]*100, np.zeros(800))) # densidad inicial de rho
newL = np.zeros(Nx)
# inicializando una segunda matriz para actualizar los resultados
newL[0] = 0.0
# forzar la condición de frontera rho(0) = 0
newL[Nx-1] = 0.0
# forzar la condición de frontera rho(10) = 0
j = 0
# bucle principal
while j < MaxIter:
for i in range(1,Nx-1): # bucle dentro de la matriz, tenga en cuenta los límites
newL[i] = (oldL[i+1] + oldL[i-1])/2.0 - 0.5*v*(oldL[i+1]-oldL[i-1])
oldL = newL[:]
# duplicar la matriz "new"
j += 1
print("No. de muestras = ", Nx)
print("No. de iteraciones = ", MaxIter)
print("delta x = ", dx)
print("delta t = ", dt)
xs = [dx * float(i) for i in range(Nx)]
# valores "x" para esta discretización: Dx * i
# nombrar el eje "x", el eje "y" y el gráfico completo
plt.xlabel("x(m)")
plt.ylabel("rho(x)")
plt.title("Tarea 3")
plt.scatter(xs, newL, color='b', label='Lax')
plt.legend()
# agregar leyenda, lo que nos ayuda a reconocer la curva según su color
plt.show()
# para cargar la ventana de visualización
davy.ai
Para modificar el código de la variable de velocidad (v=10+x), necesitamos actualizar la fórmula para la actualización de los elementos del arreglo. La nueva fórmula debería incluir la velocidad como una variable, que cambia para cada elemento. Una forma de hacer esto es calcular el valor de la velocidad para cada índice utilizando la fórmula de la posición v=10+x, y luego utilizar este valor de la velocidad en la fórmula de actualización. El código actualizado puede verse de la siguiente manera:
En este código, definimos una nueva función
v_func(x)
que calcula la velocidad como una función de la posición. Luego utilizamos esta función para calcular la velocidad máxima y utilizarla para calcular el paso de tiempodt
. En el bucle principal, utilizamosv_func()
para calcular la velocidad en cada índice y la utilizamos en la fórmula de actualización. Finalmente, graficamos el resultado de la misma manera que antes.