Ich habe eine wiederkehrende Formel.JMP kann es lösen, aber es warnt jedes Mal vor Zyklen, wenn ich eine neue Formel erstelle.
Wie kann ich:
- Eine neue Iteration erzwingen?
- Konfigurieren Sie die Anzahl der Iterationen (oder Stoppkriterien), um die Wiederholung zu lösen?
- Beenden Sie die erneute Auswertung? Option Auswerten im Formelmenü unterdrücken, hat nicht funktioniert.
Die Funktion ist etwas komplexer aber nicht anders als die folgende, die klaglos funktioniert.
X(k+1) = 0,99 * X(k)
If(
Selected() == 1, 1,
Row() == 1, 1,
Lag( :X ) * 0.99
)
Die Formelauswertung von JMP funktioniert, indem zuerst Formelspalten ausgewertet werden, die nur von Nicht-Formelspalten abhängen, und dann Formelspalten, die von bereits ausgewerteten Formelspalten abhängen. Wenn die Formel von Spalte A von Spalte B und die Formel von Spalte B von Spalte A abhängt, kann JMP nicht auswählen, welche Formel zuerst ausgewertet werden soll. Wenn Sie es schaffen, JMP dazu zu bringen, eine zirkuläre Abhängigkeit zu erstellen, können Sie nicht sicher sein, welche Spalte alte Daten aus der anderen Spalte verwendet.
JMP wertet eine Spalte von oben nach unten aus. Innerhalb einer Formel können Sie die Verzögerungsfunktion (oder Subscripting) verwenden, um frühere Zeilen anzuzeigen und den zuvor berechneten Wert abzurufen. Ich bin mir nicht sicher, was passiert, wenn Sie sich zukünftige Zeilen ansehen, aber dieser Wert wurde noch nicht berechnet.
Es gibt Formeln, von denen Sie glauben, dass sie auf Excel-Regeln basieren könnten, aber JMP ist keine Tabellenkalkulation und spielt nach den oben genannten Regeln. Wenn Sie Spalte A auf eine Verzögerung von Spalte B und Spalte B auf eine Verzögerung von Spalte A beziehen müssen, sollten Sie A und B zu Nicht-Formel-Spalten machen und JSL schreiben, um sie auszufüllen. Fügen Sie diese JSL einem Tabellenskript mit einem Namen wie "Run Me, wenn die Daten aktualisiert werden müssen" hinzu.
Wenn Sie eine rekursive Funktion haben, können Sie eine JSL-Funktion erstellen, die sich selbst aufruft. JSL hat eine ziemlich niedrige Grenze für die zulässige Rekursionstiefe, etwa 100. Sie müssen Ihre eigene if-Anweisung schreiben, die entscheidet, wann die Rekursion beendet wird. Normalerweise wird ein Tiefenparameter verwendet, um die Rekursion zu stoppen, etwa (ungetestet und sinnlos ...)
f = function({depth}, if(depth < 10, /* do something */ f(depth + 1) ) );
f(0)