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.

Dymos – conexión al análisis aguas abajo – índice de variables

Me gustaría hacer un análisis aguas abajo de mi trayectoria, como se describe aquí:

https://openmdao.github.io/dymos/faq/downstream_analysis.html

Lo que quiero hacer es ligeramente diferente: no quiero conectar el final o el principio (o algún índice fijo) de una fase a algún componente aguas abajo. Lo que quiero hacer es encontrar el nodo/tiempo donde un estado específico tenga su valor máximo dentro de una fase, y luego conectar varias variables de estado para ese tiempo/nodo a mi análisis aguas abajo. El nodo/tiempo donde se produce el máximo cambiará en función de los inputs del problema, por lo que no se puede saber de antemano.

Para ser específico, lo que estoy intentando hacer es analizar el punto de máxima presión dinámica (Max-Q) en el ascenso del vehículo de lanzamiento. Probablemente podría simplemente mirar cada punto en la fase donde se produce el Max-Q, pero quizás no sea necesario.

Podría simplemente usar una función “max” en el array de valores de presión dinámica de la fase, obtener el índice y los otros estados de interés en ese índice. Pero, ¿cómo se diferencia eso?

Tags:  

Answer

  1. Avatar for davy.ai

    Para encontrar el nodo o tiempo en el que un estado específico alcanza su valor máximo dentro de una fase en OpenMDAO, se puede usar el método get_values para extraer el valor de la variable de estado en cada nodo, y luego utilizar la función argmax de NumPy para encontrar el índice del valor máximo. Una vez que se tiene el índice del valor máximo, se puede usar nuevamente el método get_values para extraer los valores de las otras variables de estado en ese nodo/tiempo, y conectarlos a su análisis posterior.

    Por ejemplo, para encontrar el nodo/tiempo de mayor presión dinámica (Max-Q) en un problema de ascenso de un vehículo de lanzamiento, se podría hacer algo como esto:

    from openmdao.api import Problem
    from dymos import Phase
    
    # crea tu problema de ascenso del vehículo de lanzamiento en OpenMDAO
    
    # especifica los tiempos en los que deseas evaluar la presión dinámica
    times_to_check = [0.1, 0.2, 0.3, ..., t_f]
    
    # recorre los tiempos y encuentra el índice de la mayor presión dinámica en cada tiempo
    for t in times_to_check:
        p = Problem()
        phase = Phase(transcription=tu_transcripción...)
        p.model.add_subsystem('phase', phase)
        # agrega el resto de tu modelo aquí...
    
        p.setup(check=True)
    
        # establece el tiempo inicial y final de la fase en el tiempo que estás revisando
        p.set_val('phase.t_initial', t)
        p.set_val('phase.t_duration', 0.0)
    
        # resuelve el problema para obtener los valores de la presión dinámica en cada nodo
        p.run_model()
    
        # extrae los valores de la presión dinámica en cada nodo
        q = phase.get_values('q')
    
        # encuentra el índice de la mayor presión dinámica y extrae los valores de las otras variables de estado en ese índice
        max_q_index = np.argmax(q)
        max_q_time = phase.get_val('time', index=max_q_index)
        other_state_values = phase.get_values(['state1', 'state2', ...], index=max_q_index)
    
        # conecta los valores de las otras variables de estado a tu análisis posterior
        ...
    

    Para diferenciar esto, se podrían utilizar herramientas de diferenciación automática como las proporcionadas por OpenMDAO y Dymos. Simplemente agrega las variables de estado que deseas diferenciar al diccionario state_options para tu fase, establece sus targets en lo que deseas diferenciar con respecto a ellas (por ejemplo, ctrls u otras variables de estado), y luego agrega una restricción dynamic o path que involucre la derivada de la variable de estado. La derivada de la variable de estado se calculará automáticamente por OpenMDAO durante el proceso de optimización.

Comments are closed.