■ No.8 (2001.12.05) … これまでの復習

さて,授業日程も半分まで来たところで,学生によっては,数学+コンピュータ+Mathematica という三重苦 に消化不良をおこしつつある者もいるだろう. そこで,この辺りでいったん休息を入れ,これまでの簡単な復習を行おう.

復習問題 … 消化不良をおこしつつある人用

  1. Sin[x] は x の正弦を与える. では,y = Sin[x] の式で y が与えられたとき,x の値を求めるにはどうしたらよいか? ?Sin を実行し,その結果をよく調べて考えよ.

    → Help を使いこなす問題.英語が読めない,読むのはいやだ… というならば「勘」を養う必要がある. しかし,きちんと英語を学ぶのとハズレるかもしれない勘を養うのと,どちらがましか?

  2. Sin 関数を計算しようとして,試しに Sin(0) と入力して計算したら 答えが 0 になったので安心して, Sin(Pi) と入力したらなんか答えがおかしい. なぜだろうか? どうしたらいい?

    → よくやるミスである.が,気づかないとモニタの前でもったいない時間を過ごすことになる(^-^).

  3. 一般に,次の二つの量はどちらが大きいか.
               a2+b2
              ------,   a * b
                 2
               
    → Simplify を使いこなす問題. ただし,a と b が実数でないと意味がないので, Element[{a,b}, Reals] として a と b が実数だ,と主張しておこう.

  4. とある液体が蒸発して減っていくとする. 1日たつと 1/10 の量に減るとしよう. この時,0日経過,1日経過,2日,… 10日経過時の量をリストにすると

    {1, 1/10, 1/100, 1/1000, 1/10000, 1/100000, ..., 1/1000000000, 1/10000000000}

    といった感じになるが,このリストをつくれ.

    → Table を使う問題.最初と最後,つまり範囲があっているかは常に確認しよう.

  5. 上の問題で作ったリストをグラフにしてみよ. さらに,そのグラフを点ではなくて線で結んだり,色を付けたりしてみよ.

    → ListPlot を使う問題.簡単なオプションは覚えておくと楽か. オプションを Help で調べるには,??コマンド とするのは覚えているか?

  6. (ちょっと難しい)
    上の問題で作ったグラフをみると挙動がよくわからない. そこで同じリストを片対数グラフで描いてみよ. 対数グラフのありがたみがわかるはずである.

    → LogListPlot というコマンドを使う.詳しくは Help を見るとよいが,何も考えなくても使えるだろう. LogLogListPlot を以前使ったときと同様に,Graphics パッケージを読み込む必要があるのに注意. 詳しくは以下を見よ.



    ● データのグラフを片対数で描く … LogListPlot[リスト]
    → y 軸だけを対数にしたグラフを描く.
    → Graphics パッケージ読み込み,つまり, Needs["Graphics`"]; を事前にしておかないと使えないので注意.


  7. 実数 x が 0以上1以下の数だとして,次のような関数を考える.

                     2x     : x <= 0.5 の場合
             f(x) =
                     2 - 2x : x >  0.5 の場合
             
    この関数を Mathematica で実現しろ. つまり,f[0.3] を入力すると,0.6 が, f[0.8] を入力すると 0.4 が答えとして出てくるようにしろ,とい うこと.

    → 関数の定義,と If を使いこなす問題. 以前使った例をみれば簡単.

  8. 上で定義した関数 f が正しく定義できているか,f のグラフを x ∈ [0,1] の範囲で描け.

    → Plot を使いこなす問題.

  9. 上で定義した関数 f を π/4 に作用させると約 0.429 が得られ, その 0.429 にさらに f を作用させると 0.858 が得られる. この様に,π/4 に f を n 回作用させた結果を n= 0 .. 50 まで並べ たリスト

    {π/4, 0.42920.., 0.85840..., .... , 0.965529..} ← ちなみに,50 回目は 0.965529.. となる.

    を作れ.

    → Nest を使いこなす問題. Nest[f, π/4, n] で,初期値を π/4 として f を n 回作用 させた結果が得られる. あとは,Table と組み合わせて…
    あと,できれば関数 f の定義に //N をつけておくと楽か.

    → ただし,こういう風に Nest を使うのは計算時間が非常に無駄になる. これを回避する方法 → 発展問題


  10. 上で得られたリストを(線でつないだ)グラフで描いてみよ. 関数 f について何も知らずにこのグラフをはじめて見たときに 関数 f が想像できるだろうか,考えよ.

    → ListPlot を使う問題.Mathematica としては簡単. でも,得られたグラフは…

  11. 正の整数 n が素数かどうかは PrimeQ[p] というコマンドでチェックできるが, この PrimeQ と同様の働きをする関数を自分で作れ. 多少計算時間がかかる方法でもかまわない.

    → 関数の定義 Module (複雑な方)と Do, While 等の「繰り返し」を使いこなす問題. よ〜っ〜く考えよう.

発展問題 … 消化十分で,暇をかましている人用

  1. 復習問題 9 の指摘にある, 「こういう風に Nest を使うと計算時間が無駄」というのはなぜか.

  2. 復習問題 9 の指摘にある, 「こういう風に Nest を使うと計算時間が無駄」というのを回避する にはどうプログラムすればよいか.

    → リストに要素を付け加えるコマンドは Append という. これを用いて,「リストの最後の要素に f を作用させて,リストにつけ加える」 ことを繰り返す,ということができる… のを使えば.

  3. 復習問題 9, 10 の計算結果,グラフから f(x) を推定するには,実は (xk, xk+1), k=1,2,... からなるリストをプロットしてみる,という手がある. これをやってみよ.

    → なぜなら,xk+1 = f(xk) の関係にあるのだから. データはこの関係のサンプルがたくさん集まっているもの,と思えばよいのだ.

  4. 正の整数 p と p+2 がともに素数であるとき,この組を「双子素数」と呼ぶ. 双子素数を小さい方からいくつか求めてみよ.

  5. 双子素数 (p,p+2) に対して,
                                  1
                     Σ          ---
             (p,p+2)が双子素数     p
             
    を(厳密には無理だがある程度)計算してみよ. またグラフを用いて,計算した値が真の値にどれくらい近づいたか考えてみよ.

    → この値が発散する(∞になる)ならば,双子素数は無限個ある, ということになる. しかし実際は…

    ちなみに双子素数が無限個あるのか有限個しかないのかは未判明.


□ レポート課題 1 復習問題,発展問題をできるだけ解け.

>> 目次