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.

En OpenMDAO, ¿puedo utilizar set_check_partial_options para evitar que ciertas derivadas sean verificadas?

Tengo un om.ExplicitComponent en el que algunas de las derivadas son exactas (analíticas) y se pueden comprobar con el método de paso complejo (cs), algunas de las derivadas son analíticas pero no se pueden comprobar con cs, y algunas solo se pueden evaluar con diferencias finitas.

import openmdao.api as om

from scipy.special import ellipe, ellipk
from scipy.special import hyp2f1

class MWE(om.ExplicitComponent):
    def setup(self):
        self.add_input("a")
        self.add_input("b")
        self.add_input("c")
        self.add_output("x")
        self.add_output("y")
        self.add_output("z")

    def compute(self, inputs, outputs):
        a = inputs["a"]
        b = inputs["b"]
        c = inputs["c"]
        outputs["x"] = a**2
        outputs["y"] = ellipe(b)
        outputs["z"] = hyp2f1(1 / 10, a, 1 / 2, c)

    def setup_partials(self):
        self.declare_partials("x", ["a"], method="exact")
        self.declare_partials("y", ["b"], method="exact")
        self.declare_partials("z", ["a"], method="fd")
        self.declare_partials("z", ["c"], method="exact")

    def compute_partials(self, inputs, J):
        a = inputs["a"]
        b = inputs["b"]
        c = inputs["c"]
        J["x", "a"] = 2 * a

        J["y", "b"] = (ellipe(b) - ellipk(b)) / (2 * b)

        J["z", "c"] = (a / 5) * hyp2f1(11 / 10, 1 + a, 3 / 2, c)

¿Hay alguna forma de utilizar una o más llamadas a set_check_partial_options y check_partials para:

  • Comprobar J["x", "a"] utilizando el método cs, ya que es el más exacto o exigente,
  • Comprobar J["y", "b"] utilizando el método fd, ya que las funciones elípticas no pueden manejar números complejos,
  • Comprobar J["z", "c"] utilizando el método fd por la misma razón, y
  • No preocuparse por comprobar J["z", "a"] en absoluto, ya que se necesita evaluar utilizando fd de todos modos, ya que no hay una formulación analítica posible (al menos dentro de scipy)?
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para verificar las derivadas parciales utilizando los métodos apropiados, puede utilizar el método set_check_partial_options para especificar el método de verificación para cada derivada parcial en cuestión. Aquí hay un ejemplo de cómo puede modificar la clase MWE para lograr esto:

    import openmdao.api as om
    
    from scipy.special import ellipe, ellipk
    from scipy.special import hyp2f1
    
    class MWE(om.ExplicitComponent):
        def setup(self):
            self.add_input("a")
            self.add_input("b")
            self.add_input("c")
            self.add_output("x")
            self.add_output("y")
            self.add_output("z")
    
        def compute(self, inputs, outputs):
            a = inputs["a"]
            b = inputs["b"]
            c = inputs["c"]
            outputs["x"] = a**2
            outputs["y"] = ellipe(b)
            outputs["z"] = hyp2f1(1 / 10, a, 1 / 2, c)
    
        def setup_partials(self):
            self.declare_partials("x", "a", method="exact")
            self.declare_partials("y", "b", method="exact")
            self.declare_partials("z", "a", method="fd")
            self.declare_partials("z", "c", method="fd")
    
        def compute_partials(self, inputs, J):
            a = inputs["a"]
            b = inputs["b"]
            c = inputs["c"]
            J["x", "a"] = 2 * a
    
            J["y", "b"] = (ellipe(b) - ellipk(b)) / (2 * b)
    
            J["z", "c"] = (a / 5) * hyp2f1(11 / 10, 1 + a, 3 / 2, c)
    
            # Utilice set_check_partial_options para especificar el método de verificación para cada derivada parcial
            self.set_check_partial_options(wrt="a", method="cs")
            self.set_check_partial_options(wrt="b", method="fd")
            self.set_check_partial_options(wrt="c", method="fd")
    
            # Llame a check_partials para verificar las derivadas parciales
            cpd = self.check_partials(compact_print=True)
    
            # No verifique J["z", "a"] ya que se evalúa utilizando el método fd, que no se puede verificar utilizando el método cs
    

    En esta versión modificada de la clase MWE, utilizamos el método set_check_partial_options para especificar qué método utilizar para verificar cada derivada parcial. Luego llamamos a check_partials para verificar las derivadas parciales. También excluimos J["z", "a"] de la verificación ya que debe evaluarse utilizando fd de todos modos y no se puede verificar utilizando cs.

Comments are closed.