私は再発する式を持っています。JMPはそれを解決できますが、新しい数式を作成するたびにサイクルについて警告します。
どうやって:
- 新しい反復を強制しますか?
- 再発を解決するために反復回数(または停止基準)を構成しますか?
- 評価が再び行われるのを止めますか? 数式メニューの[評価の抑制]オプションが機能しませんでした。
機能はもう少し複雑ですが、文句なしに動作する以下のものと違いはありません。
X(k + 1)= 0.99 * X(k)
If(
Selected() == 1, 1,
Row() == 1, 1,
Lag( :X ) * 0.99
)
JMPの数式エバリュエーターは、最初に非数式列のみに依存する数式列を評価し、次にすでに評価されている数式列に依存する数式列を評価することによって機能します。 列Aの式が列Bに依存し、列Bの式が列Aに依存している場合、JMPは最初に評価するものを選択できません。 JMPをだまして循環依存関係を作成させた場合、どの列が他の列の古いデータを使用していたかを確認できません。
JMPは、列を上から下に評価します。 数式内で、ラグ関数(またはサブスクリプト)を使用して、以前の行を調べ、以前に計算された値を取得できます。 将来の行を見るとどうなるかわかりませんが、その値はまだ計算されていません。
Excelのルールに基づいて機能すると思われる数式がありますが、 JMPはスプレッドシートではありません上記のルールに従って再生します。 列Aが列Bのラグを参照し、列Bが列Aのラグを参照するようにする必要がある場合は、AとBを非数式列にし、JSLを記述してそれらを埋める必要があります。 そのJSLを、「データを更新する必要があるときに実行する」などの名前のテーブルスクリプトに追加します。
再帰関数がある場合は、それ自体を呼び出すJSL関数を作成できます。 JSLには、許容される再帰の深さの制限が100程度とかなり低くなっています。 再帰をいつ停止するかを決定する独自のifステートメントを作成する必要があります。 通常、深さパラメータは、再帰を停止するために使用されます。たとえば、(テストされておらず、無意味です...)
f = function({depth}, if(depth < 10, /* do something */ f(depth + 1) ) );
f(0)