演算子add
の代わりにsum
使用することで、必要なものを取得できるはずです。better_cos
add
数列の有限数の項を合計するには、 を使用する方が適切な場合が多く、 にadd
は Maple のいわゆる特別な評価規則があることにも注意してください。
一定数の項 (つまり、0 から 20 までの n) の合計を取るつもりなら、各入力引数 (つまり、 の各値x
) の階乗を計算する手続きを書くべきではありません。代わりに、切り捨てられた系列を 1 回だけunapply
生成してから、演算子を生成するために使用します。1
このアプローチは、シンボルx
が使用されているためx^0 項になるため、元の問題にも対処できます。
また、多項式 (切り捨てられた級数) をホーナー形式になるように再配置して、後で x のさまざまな数値で評価するときに算術ステップを最小限に抑えようとすることもできます。
たとえば、簡潔にするために 20 語ではなく 5 語を使用すると、
convert(add((-1)^n*x^(2*n)/factorial(2*n), n = 0 .. 5),horner);
/ 1 /1 / 1 / 1 1 2\ 2\ 2\ 2\ 2
1 + |- - + |-- + |- --- + |----- - ------- x | x | x | x | x
\ 2 \24 \ 720 \40320 3628800 / / / /
bc := unapply(%,x):
bc
シンボリック引数または数値引数のいずれかを使用して、必要に応じてプロシージャを適用できるようになりました。
expand(bc(x));
1 2 1 4 1 6 1 8 1 10
1 - - x + -- x - --- x + ----- x - ------- x
2 24 720 40320 3628800
bc(0);
1
bc(1.2);
0.3623577360
項の数が可変になるようにプロシージャbetter_cos
に引数のペアを使用させたい場合でもadd
、元の問題を処理するために を使用することを検討できます。例えば、
bc := (x,N)->add((-1)^n*x^(2*n)/(2*n)!, n = 0 .. N):
これは宿題であり、既存のシステム コマンドを使用しtaylor
たりseries
、同じ結果を得ることができることを認識していると思います。
convert(series(cos(x),x=0,10),polynom);
1 2 1 4 1 6 1 8
1 - - x + -- x - --- x + ----- x
2 24 720 40320
convert(taylor(cos(x),x=0,10),polynom);
1 2 1 4 1 6 1 8
1 - - x + -- x - --- x + ----- x
2 24 720 40320