es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , ,

Answer

  1. Avatar for 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:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # número de iteraciones
    MaxIter = 800                           
    # no. de puntos
    Nx = 1000
    # velocidad de propagación
    c = 10.0                            
    xmin = 0.0
    xmax = 100
    
    dx = (xmax - xmin) / Nx
    
    # definiendo la velocidad como una función de la posición
    def v_func(x):
        return 10.0 + x
    
    # calculando el paso de tiempo utilizando la velocidad máxima
    dt = dx / np.max(v_func(np.linspace(xmin, xmax, Nx)))
    
    oldL = np.concatenate((np.zeros(100), [1.0]*(100), np.zeros(8*100))) 
    newL = np.zeros(Nx)
    
    newL[0] = 0.0                           
    newL[Nx-1] = 0.0                           
    
    j = 0
    while j < MaxIter :    
        for i in range(1, Nx-1):
            # calculando la velocidad para este índice
            v = v_func(xmin + i*dx)
            # utilizando el valor de la velocidad en la fórmula de actualización
            newL[i] = (oldL[i+1] + oldL[i-1])/2.0 - 0.5*v*(oldL[i+1]-oldL[i-1])/(c*dx)
    
        oldL = newL[:]
        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)] 
    
    plt.xlabel("x(m)")
    plt.ylabel("rho(x)")
    plt.title("Tarea 3")
    
    plt.scatter(xs, newL, color='b', label='Lax')
    plt.legend()
    plt.show()
    

    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 tiempo dt. En el bucle principal, utilizamos v_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.

Comments are closed.