Watch videos with subtitles in your language, upload your videos, create your own subtitles! Click here to learn more on "how to Dotsub"

EIWL27AVTake2

0 (0 Likes / 0 Dislikes)
Stephen Wolframによる「はじめての Wolfram言語」のセクション27では 関数を繰り返し適用する方法を取り上げる. ここでは主に関数NestListと,それに関連するNestやNestGraph等の関数を使用する. 関数を繰返し適用する基本的な考え方を,例を使って説明する. NestList関数を使って関数 f を引数 x に繰り返し適用する. 同じ入力であるが,今度はFramed関数を使う. NestListの最後の引数は4で,これは関数を適用する回数である. 結果の最後の要素だけ必要な場合は,NestListではなくNest関数を使う. 多くの場合,関数を繰返し適用することを活かすのに大切なのは, 関数を注意深く選ぶことである. この例ではEdgeDetect関数を円の画像に繰返し適用して面白い結果を生成する. 適用する関数は純関数でもよい. 例えばこのNestListでは,純関数を使って各結果にColorNegateとEdgeDetectを適用する. 式や数学的操作の適用を繰返すことで,いろいろな計算が表現できる. 例えばこれは1を加え,結果の平方根を計算することを繰り返す. この例でも純関数を使用した. N関数をリストに適用すると,1.6より少し大きい値に数が収束することがわかる. これは黄金比と呼ばれる有名な数である. このようなプログラミングがよく使われる別の用途として,ランダムウォークがある. 「ランダムウォーク」とは,ホコリのかけらや株式価格,採食中の昆虫等, 何らかのものの位置のランダムな動きのことである. Wolfram言語には,ランダムウォークのステップサイズを選択するのに便利な RandomChoiceという関数がある. これは選択肢のリストから項目をランダムに選択して返す関数である. 例えばRandomChoice関数を使って数のリストから要素をランダムに選択する. ここではステップが +1 か -1 かである 一次元のランダムウォークだけを考える. 数直線上で正または負の方向に1単位だけ ステップを繰り返し取ることを想像すればよい. RandomChoice関数を使用し,正または負の1ステップをランダムに選択する. 引数を1つ取り,引数にランダムなステップを加える純関数を使う. この純関数をNestListの第1引数として使用し, ゼロから始めて各ステップごとに正または負に 1 だけ動くランダムウォークを作る. 500ステップのランダムウォークをプロットする. このセクションでは主に「再帰」というプログラミング方法について取り上げる. 再帰とは,関数の結果に同じ関数を適用することであるが, 本書では「繰返し」という別の方法についても述べる. 「繰返し」はあるステップ一式を繰返し行うプログラミングのことである. Wolfram言語では,再帰も繰返しも行える. ほとんどのプログラムは,どちらででも書ける. 例えばNestListを使ったこのプログラムでは, 引数を2倍する関数を再帰的に適用する. 同じ結果を得る別の方法もある. Table関数を使い,nのさまざまな値について2のn乗を計算する. これは再帰ではなく繰返しである. あるプログラミング方法が別のものより簡単であったり速かったり, より自然であったりすることがよくある. またそのようなことがあまり関係のない状況というのもある. このセクションでここまで見てきた例はすべて 繰返しのプログラムで書くと非常に簡単であるが, 再帰的なプログラムの方が自然で分かりやすい例もある. 例えばこのプログラムはネストした列を与える. NestListの第1引数の関数は2つの要素を持つ列を作成する. 各要素で同じ関数が適用される. 各列の周りにFrameを加えると,結果のネスト構造が見やすい. 次はColumnではなく,Gridだけを使った例である. 各ステップで関数を再帰的に4回使用する. 最後の要素は4つの要素を持つ格子で, そのそれぞれは4要素を持つ格子で, そのそれぞれは4要素を持つ格子,というように,開始要素 x まで続く. 再帰のよい点は,結果がこのように複雑である場合でも, プログラムは非常に簡単である点である. これは,プログラムを作成する際に複雑な構造について考える必要がないからである. それぞれのステップを行う関数についてさえ理解していればよい. 残りはコンピュータが行う. これはパスカルの三角形を生成する例である. パスカルの三角形は数のパターンであり,数学のさまざまな場面で現れる. ここで適用する関数は,NestListの第1引数であるが, パスカルの三角形の1行から次の行にどのように移動するのかを表している. 残りの操作はNestList関数が行う. パスカルの三角形は格子として表されていると見やすい. NestListの第1引数は,前の行と,それを1要素分横にシフトしたものを足し合せて次の行を生成する. このようなネストした再帰構造を木構造やグラフとして考えると役立つことがある. グラフはセクション21で取り上げたが,辺で連結された頂点の集合である. これはWolfram言語でのグラフの例である. 頂点1から頂点2を繋げる辺,頂点1から頂点3を繋げる辺, そして頂点3から頂点4,頂点3から頂点5を繋げる辺がある. この頂点は都市を表し,辺は都市1から都市2,都市1から都市3等の道路を表しているかもしれない. 再帰プログラムとグラフの関係を説明するために, 前に使った,引数を2倍する関数を持つNestListの例をもう一度見てみる. これはNestGraphという関数で,結果の各要素をグラフのノードで示し, 関数を適用する部分をノード間の接続で示す. これは特にシンプルなグラフで,道グラフと呼ばれる. NestGraphでは,関数が適用されるたびに,結果は新しい頂点として表され, その頂点は新しい辺で前の頂点と接続される. これらのグラフは,関数を適用した結果がリストの場合,より面白くなる. NestGraph関数がリストを新しい頂点のリストとして, また,前の頂点と新しい各頂点への新しい辺のリストとして解釈するからである. これはNestGraphの第1引数が関数である場合に2つの要素を持つリストを返す例である. 各ステップで2つの新しい頂点と2つの新しい辺が生成される. グラフはxとラベルが付けられた頂点から始まり, 関数を適用するとそこから頂点 f[x] および g[x] まで辺が生成される. これらの頂点はそれぞれさらに2つの頂点へと繋がる. これは別の例である.ここでは頂点は整数である. 前の例と同様に,関数の出力は2要素のリストであり, 各頂点 n には,頂点 2n と 2n+1 に繋がる2本の辺がある. 次の例は,コンピュータがインターネットに繋がっていて Wolframのデータサーバにアクセスできる必要がある. これはNestGraph関数を使い, まずはスイスとの国境がある国々, そしてさらにそれらの国々との国境がある国々のグラフを作る. この複雑なグラフはすべて, 国境のある国を探す以外の複雑なことは何もしない簡単な関数を 再帰的に使って構築されている. これでセクション27のビデオでの例はおしまいである. このセクションで使用した関数をまとめる. 新しい関数はNest,NestList,NestGraphだけである. 例題では関数RandomChoiceを追加で使用した. しかし,これらの関数以外で,このセクションで大切なのは, 再帰,つまり関数がそれ自体を繰返し呼び出す方法を使って プログラムを構築する考え方である. Wolfram言語のこれらの関数および関連関数についての詳細情報は, 「ヘルプ」メニューから「Wolframドキュメントセンター」を選び, 現れたドキュメントセンターで 「コアとなる言語と構成」ボタンをクリックし, 「関数型プログラミング」を選んで現れたページの 「関数を繰り返し適用する」の見出しの下に, Nest,NestList,NestGraph,およびこれらに関連する多くの関数へのリンクが含まれている. セクション27の練習問題を見てみよう. これらの練習問題では,簡単な指示を適用するだけで 複雑な構造を生成したり難題を解いたりできる 再帰的プログラムの卓越した能力が分かる. 練習問題27.10を見てみよう. 「0から始め,値nのノードを値n+1と2nのノードにそれぞれ10回ネストして接続し,グラフを生成しなさい.」 この問題の要は,ノード n をノード n+1 と 2n に接続する関数である. これがそれを行う関数である. この関数は引数を1つ取るが, この場合この引数は現在のノード番号 n である. この関数は要素 n+1 と 2n のリストを返す. これで2つの目的ノードへの接続ができる. その後は,NestGraphが残りのほとんどを行ってくれる. NestGraphの第1引数にこの関数を使い, 練習問題で指定されているように 0 から始める. 構造がスクリーンにうまく収まるように 10回ではなく8回ネストする. VertexLabelsを加え,評価する. 簡単な数行の入力で驚くほど複雑なグラフが得られる. 他の練習問題もおもしろい. 多くの再帰的プログラミングは,最初の印象よりずっと簡単にできる. 練習問題をいくつか試してみて, 再帰的プログラミングのおもしろい用途を見付けていただきたい.

Video Details

Duration: 9 minutes and 7 seconds
Country:
Language: English
License: Dotsub - Standard License
Genre: None
Views: 5
Posted by: wolfram on Aug 31, 2020

EIWL27AVTake2

Caption and Translate

    Sign In/Register for Dotsub above to caption this video.