Manera correcta de utilizar el derivado JSLHe estado intentando crear derivados de un modelo de superficie de respuesta con JSL desde hace algún tiempo. La falta de documentación y publicaciones en el foro aquí que solo apuntan a la creación manual de derivados no ha resuelto mi problema. Ya tengo un ajuste y la fórmula de predicción se guardó en una columna de la tabla de datos. Lo que me gustaría hacer es usar JSL para crear el derivado simbólico de la fórmula y aplicarlo a otra columna. Hasta ahora, el siguiente código son todas las diferentes formas en que he intentado resolver este problema sin éxito.
// Get Formula
//formula = col << Get Formula;
formula = Expr((-211374703.282551) + 30.8532207444449 * :X1);
Show( formula );
// Make derivative
derivative = Derivative(formula, X1);
Show(derivative);
derivative = Derivative(formula, :X1);
Show(derivative);
derivative = Derivative(formula, "X1");
Show(derivative);
derivative = Derivative(formula, ":X1");
Show(derivative);
derivative = Derivative(formula, Column(:X1));
Show(derivative);
derivative = Derivative(Eval(formula), X1);
Show(derivative);
derivative = Derivative(formula, Eval(X1));
Show(derivative);
derivative = Derivative(Eval(formula), Eval(X1));
Show(derivative);
derivative = Derivative(Expr(formula), X1);
Show(derivative);
derivative = Derivative(formula, Expr(X1));
Show(derivative);
derivative = Derivative(Expr(formula), Expr(X1));
Show(derivative);
Y la salida que obtengo es
formula = (-211374703.282551) + 30.8532207444449 * :X;
derivative = 0;
derivative = 0;
derivative = .;
derivative = .;
derivative = .;
derivative = 0;
derivative = .;
derivative = .;
derivative = 0;
derivative = .;
derivative = .;
Normalmente, la fórmula se extrae de la columna que contiene la fórmula de predicción guardada y, en este caso, la impresión muestra correctamente la fórmula.
¿Que me estoy perdiendo aqui? Pensé que este sería un proceso sencillo.
¡Gracias por cualquier ayuda que puedas brindar!
AnalíticaRe: Forma correcta de utilizar JSL DerivativeIntente agregar Expr adicional a su fórmula:
formula = Expr(Expr((-211374703.282551) + 30.8532207444449 * :X1));
Re: Forma correcta de utilizar JSL Derivativeformula = Expr((-211374703.282551) + 30.8532207444449 * :X1);
Show( formula );
// Make derivative
derivative = Derivative(name expr(formula), X1);
show(derivative);
La clave es evitar que la fórmula se evalúe cuando se pasa a la derivada. Envolver una segunda capa de Expr crea el comportamiento deseado, pero en realidad despega la primera capa de Expr cuando se pasa a la llamada.
Re: Forma correcta de utilizar JSL Derivative¡Gracias por la respuesta!
¿Podemos dar un paso más?
Digamos que tengo una función multivariante y quiero recorrer una lista de entradas que conozco de antemano para hacer derivadas.
Entonces, en cambio, la configuración sería
formula = Expr((-211374703.282551) + 30.8532207444449 * :MyVar1 - 0.42 * :AnotherVar2);<BR />factors = List(MyVar1, AnotherVar2);
// Clone formula n times into columns
dt << Clone Formula Column(
"Pred Formula",
N Items(factors),
);
For(i = 1, i < N Items(factors), i++,
col = Column( dt, "Pred Formula " || char(eval(i+1)) );
col << Set Name( "doptval d" || factors[i]);
// Get Formula
formula = col << Get Formula;
// Make derivative
derivative = Derivative(name expr(formula), factors[i]);
// Apply derivative to new column
col << Set Formula( derivative );
);
Ahora, intentar hacer referencia a la variable en este ciclo está provocando que la función Derivada falle. ¿Alguna idea?