Ho una formula che è ricorrente.JMP può risolverlo, ma avverte dei cicli ogni volta che creo una nuova formula.
Come posso:
- Forzare una nuova iterazione?
- Configurare il numero di iterazioni (o criteri di arresto) per risolvere la ricorrenza?
- Interrompere che la valutazione si ripeta? L'opzione Sopprimi Eval nel menu della formula non ha funzionato.
La funzione è un po' più complessa ma non diversa dalla seguente, che funziona senza problemi.
X (k+1) = 0,99 * X(k)
If(
Selected() == 1, 1,
Row() == 1, 1,
Lag( :X ) * 0.99
)
Il valutatore di formule di JMP funziona valutando prima le colonne formula che dipendono solo da colonne non formula, quindi valutando le colonne formula che dipendono dalle colonne formula già valutate. Se la formula della colonna A dipende dalla colonna B e la formula della colonna B dipende dalla colonna A, JMP non può scegliere quale valutare per prima. Se riesci a indurre JMP a creare una dipendenza circolare, non puoi essere sicuro di quale colonna utilizzava i vecchi dati dell'altra colonna.
JMP valuta una colonna dall'alto verso il basso. All'interno di una formula è possibile utilizzare la funzione di ritardo (o sottoscript) per esaminare le righe precedenti e ottenere il valore calcolato in precedenza. Non sono sicuro di cosa succede se guardi le righe future, ma quel valore non è stato ancora calcolato.
Ci sono formule che potresti pensare possano funzionare in base alle regole di Excel, ma JMP non è un foglio di calcolo e rispetta le regole di cui sopra. Se devi fare in modo che la colonna A si riferisca a un ritardo della colonna B e la colonna B si riferisca a un ritardo della colonna A, dovresti rendere A e B colonne non formula e scrivere JSL per compilarle. Aggiungi quel JSL a uno script di tabella con un nome come "Eseguimi quando i dati devono essere aggiornati".
Se hai una funzione ricorsiva, puoi creare una funzione JSL che chiami se stessa. JSL ha un limite abbastanza basso alla profondità di ricorsione consentita, circa 100. Devi scrivere la tua istruzione if che decida quando interrompere la ricorsione. In genere viene utilizzato un parametro di profondità per interrompere la ricorsione, qualcosa del tipo (non testato e inutile...)
f = function({depth}, if(depth < 10, /* do something */ f(depth + 1) ) );
f(0)