I have two questions related to the usage of functions.
The first topic is the way to evaluate the gradient. The script:
import openturns as ot x = [72.e9, 3e2, 2.5, 1.5e-7] g = ot.SymbolicFunction(["E", "F", "L", "I"], ["F*L^3/(3*E*I)"]) jacobian = g.gradient(x)
evaluates the Jacobian matrix by evaluating the
There is no way, however, to get the gradient function which would evaluate the gradient. In other words, the script:
jacobian_function = g.getGradient() jacobian = jacobian_function(x)
does not work, because the ‘Gradient’ object is not callable.
Finally, the following script works:
jacobian_function = g.getGradient() jacobian = jacobian_function.gradient(x)
but it seems quite surprising. The
gradient method should return the gradient. Since
jacobian_function is the Jacobian, we may expect that the
gradient method should return the Hessian matrix. It would seem that the
gradient method of the
Gradient class should be removed and that its implementation should be called when the
(x) operator is evaluated.
The second topic is the way to create a finite difference gradient with the script:
myGradient = ot.NonCenteredFiniteDifferenceGradient(incrementGrad, g.getEvaluation()) g.setGradient(myGradient)
I understand that a
EvaluationImplementation is required to evaluate a finite difference formula. But we may also expect that a more general
Function would fit:
myGradient = ot.NonCenteredFiniteDifferenceGradient(incrementGrad, g) g.setGradient(myGradient)
but that is not true. Why is that? Can’t the
NonCenteredFiniteDifferenceGradient call the
getEvaluation() method when required?