Modo corretto per utilizzare la derivata JSLÈ da un po' di tempo che sto tentando di creare derivati di un modello di superficie di risposta con JSL. La mancanza di documentazione e di post sul forum che puntano solo alla creazione manuale di derivati non ha risolto il mio problema. Ho già una misura e la formula di previsione è stata salvata in una colonna della tabella dati. Quello che mi piacerebbe fare è usare JSL per creare la derivata simbolica della formula e applicarla a un'altra colonna. Finora il seguente codice sono tutti i diversi modi in cui ho tentato di risolvere questo problema senza alcun risultato.
// 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);
E l'output che ottengo è
formula = (-211374703.282551) + 30.8532207444449 * :X;
derivative = 0;
derivative = 0;
derivative = .;
derivative = .;
derivative = .;
derivative = 0;
derivative = .;
derivative = .;
derivative = 0;
derivative = .;
derivative = .;
In genere la formula viene estratta dalla colonna contenente la formula di previsione salvata e in questo caso la stampa mostra correttamente la formula.
Cosa mi manca qui? Ho pensato che questo sarebbe stato un processo diretto.
Grazie per qualsiasi aiuto potresti essere in grado di dare!
AnalisiRe: Modo corretto per utilizzare la derivata JSLProva ad aggiungere Expr extra alla tua formula:
formula = Expr(Expr((-211374703.282551) + 30.8532207444449 * :X1));
Re: Modo corretto per utilizzare la derivata JSLformula = Expr((-211374703.282551) + 30.8532207444449 * :X1);
Show( formula );
// Make derivative
derivative = Derivative(name expr(formula), X1);
show(derivative);
La chiave è evitare che la formula venga valutata quando viene passata a Derivative. Il wrapping di un secondo livello di Expr crea il comportamento desiderato, ma in realtà rimuove il primo livello di Expr quando viene passato alla chiamata.
Re: Modo corretto per utilizzare la derivata JSLGrazie per la risposta!
Possiamo fare un ulteriore passo avanti?
Diciamo che ho una funzione multivariata e voglio eseguire il loop su un elenco di input che conosco in anticipo per creare derivati.
Quindi, invece, la configurazione sarebbe
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 );
);
Ora il tentativo di fare riferimento alla variabile in questo ciclo sta causando il fallimento della funzione Derivative. qualche idea?