Go to the first, previous, next, last section, table of contents.


リスト 練習問題 8 解答「Bessel 関数の最大値」

最初に、x のリストを生成します。

1:  [1, 2, 3, ..., 21]  1:  [0, 1, 2, ..., 20]  1:  [0, 0.25, 0.5, ..., 5]
    .                       .                       .

    v x 21 RET              1 -                     4 /  s 1

次に、Bessel 関数の値を計算します。

1:  [0., 0.124, 0.242, ..., -0.328]
    .

    V M ' besJ(1,$) RET

(1 TAB V M f j でも同じ事ができます。)

最大値を分離する方法は、V R X で最大値を計算し、 この最大値と全ベッセル値を比較することです。

2:  [0., 0.124, 0.242, ... ]   1:  [0, 0, 0, ... ]    2:  [0, 0, 0, ... ]
1:  0.5801562                      .                  1:  1
    .                                                     .

    RET V R X                      V M a =                RET V R +    DEL

上の最後のステップのように、最大値が唯一かどうか確認するのは良い考えです。 (結局、 sin(x) のプロットは多くの点が最大値 1 に一致したかもしれません。)

ここで得たベクトルは、ただ1個の 1 が最大値に対応する x を指し示します。 これを対応する x の値に変換するのは今や簡単なことです。

2:  [0, 0, 0, ... ]         1:  [0, 0., 0., ... ]    1:  1.75
1:  [0, 0.25, 0.5, ... ]        .                        .
    .

    r 1                         V M *                    V R +

もし a = が複数の最大値を見つけていた場合、 この方法の結果は最大値を示す x の合計になってしまい、 あまり便利ではありません。 こんな時は代わりに v m (calc-mask-vector) を使うことができました。 このコマンドは、「マスク」ベクトルのゼロに対応する「データ」ベクトルの要素を 削除するので、この例では最大値を示す x 値のベクトルを残します。

組込みの a X コマンドは、もっと効率的な方法で関数を最大化します。 具体例として、 a X を使って同じ区間で `besJ(1,x)' を最大化してみましょう。

2:  besJ(1, x)                 1:  [1.84115, 0.581865]
1:  [0 .. 5]                       .
    .

' besJ(1,x), [0..5] RET            a X x RET

a X の出力は、関数を最大にする x の値と最大値を含むベクトルです。 ごらんのように、先の単純サーチの結果は正解にかなり近いです。


Go to the first, previous, next, last section, table of contents.     利用度数