代数モードで変数を使った式を入力すると、式自身がスタックに push されます。 式は、普通のデータオブジェクトと同様に扱えます。
1: 2 x^2 - 6 1: 6 - 2 x^2 1: (6 - 2 x^2) (3 x^2 + y) . . . ' 2x^2-6 RET n ' 3x^2+y RET *
(*) 練習問題 1. ' x RET Q 2 ^ と ' x RET 2 ^ Q をやってみなさい。 両方とも同じ結果(`x')になりましたか ? なぜそうなる、あるいはそうならないのでしょうか ? 代数 練習問題 1 解答「二乗と平方根」 参照 . (*)
式に対する一般的代数操作を行うコマンド群もあります。 先の例の式から続けると、
1: 18 x^2 + 6 y - 6 x^4 - 2 x^2 y 1: (18 - 2 y) x^2 - 6 x^4 + 6 y . . a x a c x RET
最初に分配法則を使って「展開」し、 次に x のべき乗について項を整理しました。
x が 2 で y が 1/2 のときの、 この式の値を求めましょう。
1: 17 x^2 - 6 x^4 + 3 1: -25 . . 1:2 s l y RET 2 s l x RET
s l コマンドの意味は「let(代入)」で、次のように働きます。 まずスタック top の数をひとつ取って指定する変数の値として一時的に割当てます。 そして(あたかも = キーのように)スタックの次の表現を評価します。 このコマンドの後、変数は元の値(もし在れば)に戻ります。
(このチュートリアルの初めの方で、
変数 x
に値をストアすることがありました。
もしそれがまだ残っていたら、 s u x RET でアンストアする必要があります。
さもないと、上の例が正しく実行できません。)
(訳注: 前の段落の最後の説明と矛盾するように聞こえるが、矛盾しない。
上の例では、もし x
に何かストアされていたら、
y
に代入された途端に(x
に代入しなおす暇もなく)
式全体が評価されてしまう。
x
への代入を先に行えば、説明通りの動作をする。)
y が 1/2 で x が可変であるときの、元の式の最大値を求めましょう。 x の微分を取り、 それがゼロとなる x の値を探すことでそれができます。 その x の値における 関数の 2階微分がもし負であるなら、 そこで関数は極大値を取ります。
1: 17 x^2 - 6 x^4 + 3 1: 34 x - 24 x^3 . . U DEL s 1 a d x RET s 2
そう、この微分は x がゼロのとき明らかにゼロです。 他の根を見つけるために全体を x で割ってから解きましょう。
1: (34 x - 24 x^3) / x 1: 34 x / x - 24 x^3 / x 1: 34 - 24 x^2 . . . ' x RET / a x a s
1: 34 - 24 x^2 = 0 1: x = 1.19023 . . 0 a = s 3 a S x RET
式を「simplify(簡単化)」するには a s を使います。 デフォルトの簡単化機能は充分ではないので、 a s は Calc にもっと時間をかけて簡単化するよう指示します。
さて、2階微分を計算して上で見つけた根を代入してみましょう。
1: 1.19023 2: 1.19023 2: 1.19023 . 1: 34 x - 24 x^3 1: 34 - 72 x^2 . . a . r 2 a d x RET s 4
a . コマンドは方程式の右辺のみを抽出します。 もうひとつのやり方は v u で方程式 `x = 1.19' を `x' と `1.19' に分解し、 つぎに M-- M-2 DEL で `x' を消去する方法です。
2: 34 - 72 x^2 1: -68. 2: 34 - 72 x^2 1: 34 1: 1.19023 . 1: 0 . . . TAB s l x RET U DEL 0 s l x RET
2階微分の一つめは負ですから、 関数は x = 1.19023 において最大値をとることが判りました。 (また関数は x = 0 において極小値をとります。)
x について解いたとき、 34 - 24 x^2 = 0 は2次方程式であって2つの解を持つはずなのに、 1つの解しか得ませんでした。 その理由は、a S が普通一つの「主な」解を返すからです。 (2次方程式で起こるように) 任意の符号をつける必要があるとき、それは + を選びます。 任意の整数が必要ならば、それはゼロを選びます。 a S の前に H (ハイパボリック・フラグ)を押すと、 全ての解を求めることができます。
1: 34 - 24 x^2 = 0 1: x = 1.19023 s1 1: x = -1.19023 . . . r 3 H a S x RET s 5 1 n s l s1 RET
Calc には未知の符号を表現する変数 `s1' があって、 +1 か -1 どちらかの値をとります。 ここで符号が負の場合の評価のために「let」コマンドを使いました。 これを先の 2階微分に代入すると負の同じ答を得ますから、 x = -1.19023 でもまた最大となります。
真の最大値を求めるには、 x の 2つの値を元の式に代入しなければなりません。
2: 17 x^2 - 6 x^4 + 3 1: 24.08333 s1^2 - 12.04166 s1^4 + 3 1: x = 1.19023 s1 . . r 1 r 5 s l RET
(ここに s l の別の使い方があります。 s l の入力が左辺が変数である等式の場合でかつ代入先の変数指示が無ければ、 s l はその等式を左辺の変数への代入と解釈します。)
s1
の符号がどちらであってもこの値が同じになるのは明白ですが、
とにかく練習と思ってやってみましょう。
2: [-1, 1] 1: [15.04166, 15.04166] 1: 24.08333 s1^2 ... . . [ 1 n , 1 ] TAB V M $ RET
ここでは `s1' がとるいくつかの値に対する関数を一度に評価するために ベクトルのマッピング演算を使いました。 V M $ は、式をスタック top から取る以外は V M ' と同じです。 この式は、 スタックの次レベルにあるベクトル全要素に作用すべき関数と解釈されます。 スタック上の式は `$' 記号を含むことができないので、 Calc は式中の変数群がそれぞれ別の引数群の値を取るとみなします。 Calc は式中の全変数のリストをアルファベット順にデフォルトとして表示して (訳注: 変数が複数在る場合の動作が詳細不明のため要調査)、 引数リスト の入力を(あなたに)求めます。 今回の場合、デフォルトの `(s1)' はちょうど望み通りなので、 プロンプトに対して単に RET を押します。
(今回は結果が同じと判っていましたが)もしいくつか異なる値が出たら、 V R X を使って最大値を求めることができます。
Calc は組込みの a P コマンドを持っていて、 それは H a S を使って方程式を解き、全ての解のベクトルを返します。 このコマンドは、 ここまで手動でやってきた作業を簡単に自動化します。 元の 3次多項式に適用すれば、 解のベクトル [1.19023, -1.19023, 0] を生成します。 (関数の極大を見つける a X コマンドもあります。 これは微分を調べるのではなく数値収束の手法を使います。 それで、このコマンドはあなたに初期推定位置の提供を求めます。)
(*) 練習問題 2. 多項式の根のベクトルが (a P コマンドの解のように)与えられたとして、 元の多項式を再現するにはどんなコマンドシーケンスを使いますか ? (答は定数係数以外は一意に定まります。 第1項の係数が 1になるように選んでください。) 代数 練習問題 2 解答「根から多項式を作る」 参照 . (*)
m s コマンドは「symbolic mode」にします。 このモードでは、`sqrt(5)' のように厳密に評価できない式は 浮動小数の近似値にせず記号のまま残されます。 分数モード(m f)も代数では便利です。
2: 34 x - 24 x^3 2: 34 x - 24 x^3 1: 34 x - 24 x^3 1: [sqrt(51) / 6, sqrt(51) / -6, 0] . . r 2 RET m s m f a P x RET
もう一つの便利なモードは、式を読みやすくする「Big mode」です。
3 2: 34 x - 24 x ____ ____ V 51 V 51 1: [-----, -----, 0] 6 -6 . d B
ここでは、べき乗, ルート, 分数などは 2次元の文字絵形式に表示されます。 Calc は C mode, FORTRAN mode, TeX mode など、 他の言語モードも持っています。
2: 34*x - 24*pow(x, 3) 2: 34*x - 24*x**3 1: {sqrt(51) / 6, sqrt(51) / -6, 0} 1: /sqrt(51) / 6, sqrt(51) / -6, 0/ . . d C d F
3: 34 x - 24 x^3 2: [{\sqrt{51} \over 6}, {\sqrt{51} \over -6}, 0] 1: {2 \over 3} \sqrt{5} . d T ' 2 \sqrt{5} \over 3 RET
ご覧のように、言語モードは式の入力にも表示にも影響します。 組込み関数の名前、算術演算子とその優先順位、ベクトルや行列の表記なども 切替ります。
`sqrt(51)' は、C や FORTRAN の古いインプリメンテーションでは `sqrt(51.0)' としないと問題を起こすかもしれないことに注意してください。 いろいろな言語モードで生成された式が完全に正しいかどうか確認する事は賢明です。
m s, m f, d N をそれぞれタイプして、 各モードをリセットしてください。 (Big mode に留まりたいかもしれませんが、 チュートリアルの例は全てノーマルモードで示されています。)
x = 1 から 2 までの間で、 この曲線と x 軸で囲まれる面積はいくらでしょう ? これは単なる関数の積分です。
1: 17 x^2 - 6 x^4 + 3 1: 5.6666 x^3 - 1.2 x^5 + 3 x . . r 1 a i x
この積分を x の 2つの値で評価して、差を取る必要があります。 これを実行する一つの方法は、やはりベクトルのマッピングとまとめ作用です。
2: [2, 1] 1: [12.93333, 7.46666] 1: 5.46666 1: 5.6666 x^3 ... . . [ 2 , 1 ] TAB V M $ RET V R -
(*) 練習問題 3. 1 から y までの x sin(pi x) の積分を求めなさい(ただしサインはラジアンで計算します)。 y を 1 から 5 までの整数として定積分の値を求めなさい。 代数 練習問題 3 解答「x sin(π x) の積分」 参照 . (*)
Calc の積分機能は多くの単純な積分を文字のまま実行できますが、 他の多くは能力の限界を超えてしまいます。 x の同じ範囲で sin(x) ln(x) の定積分を求めたいとしましょう。 もしこの式を入力して、 そして a i x RET とタイプしたら(これを試して騒がないように)、 Calc は長いこと努力しますが解を見つけられないでしょう。 実のところ、この不定積分の解はありません。 ではどうしましょう ?
ひとつのやりかたは数値的に積分することです。 ベクトルマッピングとまとめ作用を使って、 手動でこれを実施することは難しくありません。 多少遅いけれども、 それはサインやログ関数に時間がかかるからです。 計算精度を下げてやると幾分か速くなります。
3: 10 1: [1, 1.1, 1.2, ... , 1.8, 1.9] 2: 1 . 1: 0.1 . 10 RET 1 RET .1 RET C-u v x
(ここで拡張版の v x を使ったことに注目ください。 次のようにして普通の v x を使うこともできました: v x 10 RET 9 + .1 * )
2: [1, 1.1, ... ] 1: [0., 0.084941, 0.16993, ... ] 1: sin(x) ln(x) . . ' sin(x) ln(x) RET s 1 m r p 5 RET V M $ RET
1: 3.4195 0.34195 . . V R + 0.1 *
(試してみて、とんでもなく違う結果になったとしたら、 もしかしてラジアンモードへの切替を忘れていませんか ?)
ここで曲線を10個の長さの等しい小区間に分割しました。 分割した曲線下方の小領域を長方形に近似して(すなわち、 曲線はこの分解能では水平線とみなして)その面積を計算し、 そして小領域の面積を合計しました。 (それぞれの小領域の幅が等しいので、 先に合計してから幅を掛けるほうが速いです。)
この積分の真の値はおよそ 0.374 なので、 あまり良い近似ではありません。 他のやり方を試しましょう。
1: sin(x) ln(x) 1: 0.84147 x - 0.84147 + 0.11957 (x - 1)^2 - ... . . r 1 a t x=1 RET 4 RET
関数を x=1 の周りで Taylor 級数展開しました。 多項式の積分は簡単なので、この多項式近似は積分できます。
1: 0.42074 x^2 + ... 1: [-0.0446, -0.42073] 1: 0.3761 . . . a i x RET [ 2 , 1 ] TAB V M $ RET V R -
良くなりました!
計算精度や、かつ/または Taylor 級数の項を増やすことによって、
結果の精度を必要なだけ上げることができます。
(Taylor 級数は ln(0)
のような特異点から離れた方が良く収束するので、
x=1 ではなく x=2 や x=1.5 の周りで級数展開することも
精度を向上する助けになります。)
(*) 練習問題 4. 最初の方法は、 曲線を幅 0.1 の階段で近似したので、面積は階段下方の短冊の合計でした。 2番目の方法は、階段より精度の良い多項式関数で近似しました。 第3 の方法は Simpson の法則で、 階段近似に似ていますが各ステップが平らである必要はありません。 Simpson の法則は次式に要約されます。
(h/3) * (f(a) + 4 f(a+h) + 2 f(a+2h) + 4 f(a+3h) + ... + 2 f(a+(n-2)*h) + 4 f(a+(n-1)*h) + f(a+n*h))
ただし、n (偶数であること)は分割した短冊の数で、 h は各短冊の幅です。本例ではそれぞれ 10 と 0.1 です。 参考のため、階段近似の対応する式を次に示します。
h * (f(a) + f(a+h) + f(a+2h) + f(a+3h) + ... + f(a+(n-2)*h) + f(a+(n-1)*h))
sin(x) ln(x) の 1 から 2 までの定積分を Simpson 法(10 分割とする)を使って計算しなさい。 代数 練習問題 4 解答「Simpson 法」 参照 . (*)
Calc は数値積分を行うために組込みの a I コマンドを持っています。 これは Romberg 法 を使っていて、Simpson 法の更に洗練されたものです。 特に、現在精度を満足するまで結果を精錬するアルゴリズムを持っています。
これまで見てきたコマンド群とは別に、 Calc は式の一部を取扱う一大コマンド群を提供しています。 式中の好きな所にカーソルを置いて望みの部分式を指定し、 選択(selection) コマンドを実行します。 選択コマンド群はこのチュートリアルでは触れませんが、 詳細と例は サブ数式のセレクション 参照 。
(訳注: 次は原文中でコメントアウトされていた)
難問: (2^(n r) - 2^(r*(n - 1))) / (2^r - 1) 2^(n - 1) を 2^((n-1)*(r-1)) に
簡単化しなさい。
Go to the first, previous, next, last section, table of contents.
利用度数