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 utilizandofd
de todos modos, ya que no hay una formulación analítica posible (al menos dentro de scipy)?
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 claseMWE
para lograr esto:En esta versión modificada de la clase
MWE
, utilizamos el métodoset_check_partial_options
para especificar qué método utilizar para verificar cada derivada parcial. Luego llamamos acheck_partials
para verificar las derivadas parciales. También excluimosJ["z", "a"]
de la verificación ya que debe evaluarse utilizandofd
de todos modos y no se puede verificar utilizandocs
.