ラズベリー・パイを使って、Mathematica で遊ぼう!


  • Global Moderator

    3Dアニメーションをつくろう!(つづき)

    次に、視点(カメラ)の位置を変化させるアニメーションを作ってみましょう。

    今回の対象には、別コーナーの「34.正四面体ケーキ(思考のおやつ2)」に出てきた形状を使ってみます。そして、視点の位置を、ViewPointオプションに与える値を変化させていくことで、カメラを動かして撮影するような効果を作ります。視点の座標は、viewPointsという座標のリストとして、予め作っておきます。これは、何か適切な三次元の軌跡になれば何でもよいです。

    0_1501295826830_2017-07-29-113153_759x944_scrot.png

    目的の形状を作るために、原点を中心とした正四面体の面形状(PolyhedronData["Tetrahedron","Faces"])、その原点と頂点の間の距離を半径とする球体 Sphere、それから、三次元の円をリストに並べます。最後の三次元の円を作るための関数は、Mathematicaに用意されていないので、自作します。ここでは、以下の情報交換サイトからコードを拝借しました。
    https://mathematica.stackexchange.com/questions/79524/how-to-draw-a-circle-in-3d-on-a-sphere
    この関数には、三次元の円の向きを三次元ベクトルで与える必要があります。これは、正四面体の頂点座標 vs から、外積 Crossを用いて得ました。すなわち、正四面体の2辺を含む面を通るような向きに三次元の円を指定したということです。その他の細かい部分は、今は余り気にしないで下さい。

    次に、これらを、Graphics3Dに入れ、さらにそのオプション ViewPointへ与える値 v を、viewPointsの座標列に従って変化させていき、リストを作ります。これは、これまでと同じように、Table関数を使うと簡単です。

    3Dアニメーションを作る時、ちょっとしたコツがあります。それは、ViewAngleオプションを指定することです。Mathematicaは、3Dグラフィクスを二次元に投影するときに、対象の全体(今回の場合はボックス部分の端から端まで)が入るように、自動的に表示範囲を調節してしまいます。正確に言えば、カメラの画角を勝手に変えてしまいます。これでは、視点を変えながら撮影したときに、おかしな効果を生んでしまいます。これを防ぐために、画角を固定します。具体的には ViewAngleオプションに固定値(今回は標準的な35°)を与えます。

    最後に、いつものように3Dグラフィックスのリストを GIF ファイルに出力します。今回は、Graphics3D に、ImageSizeオプションを指定することで、画像の横幅を予め200ピクセルに指定しておきました。

    obj1.gif
    0_1501295861174_obj1.gif


  • Global Moderator

    ニューラル・ネットワークで遊ぼう!

    ニューラル・ネットワーク(NN)というのは、神経細胞や神経回路網の挙動を数学的に抽象化して再現したものです。昨今、ネットワークの構成法や学習法にブレーク・スルーがあり、注目を浴びています(「ディープ・ラーニング」)。この技術と強化学習の技術を組み合わせたプログラムAlphaGoが、囲碁のプロに勝ち越したことは記憶に新しいです。全体のパターンを見る、大局観のようなものを学習させることに成功しています。人工知能という分野です。

    Mathematicaには、この最新のNNの技術が導入されており使用できます。ネットワークの構築や学習を自分で行うこともできます。しかし、難易度が高いと思われるので、ここでは、既に作成済みのNNを使用することにしましょう。組み込みのNNモデルはいくつかありますが、ここでは、「画像認識」に関わるものを使用します。画像認識に関わるNNは、今回のブレーク・スルーの発信源となったものです。

    Mathematicaに組み込まれている学習済みの画像認識NNは、ImageIdentifyという関数を通じて使用できます。このネットワークの構造は、(バージョンが少し違いますが)以下の様な構造のものです。画像の畳み込み演算の繰り返しを含むものを多段に重ねた Convolution Neural Network (CNN)と呼ばれる種類のものです。

    0_1501585808509_ImageIdentify-net.png

    さて、実際に試してみましょう。画像をコピペや Import によって得て、それを ImageIdentify に与えると、4000ぐらいある分類のうち、最もそれらしいものを答えとして出します。ここでは、Google画像検索で探した、ヒイラギの写真と、ヤマネ(dormouse)の写真をノートブック上にコピペして試してみましょう。

    注意:著作権上の問題があると思われるので、写真は加工しています。
    0_1501585831263_2017-07-17-142818_466x584_scrot.png

    それぞれ、"American Holly"(アメリカヒイラギ)と、"water vole"(ミズハタネズミ)として認識されました。後者は外れていますが、見当違いということもなさそうです。ラズベリー・パイ上で認識にかかった時間は、20-40秒程度でした。

    最後に、別スレッドから写真を持ってきましょう。謎の物体と、それから、写真ではないですが、ヤマネのイラストを試してみます。それぞれ、"coat rack"(コート掛け)、"Dora the Explorer"(「ドーラの冒険」のキャラクター)とされました。ちなみに、最新版のMathematicaでは、前者は同じでしたが、後者は、NNのパラメータが少し違うのか、"Hello Kitty"(キティーちゃん)になりました。どちらもハズレですが、全体の雰囲気を画像から認識できていることは、感じられるのではないでしょうか。

    0_1501585862588_2017-08-01-195219_466x772_scrot.png

    いろいろやって遊んでみると、NNの可能性というものが実感されてくると思います。


  • System

    先頭記事が更新されました。


  • Global Moderator

    Mathematica の最新バージョン 11.2 が発表されました。特に大きなリリースというわけではないですが、Wolfram 氏自身が最新版を使ってみて解説する動画があり楽しいです。ミスりまくりのざっくばらんな感じで、実感がこもっています:
    https://www.twitch.tv/videos/174992312

    ※戦争史好きな @riffraff さんは、44分ぐらいから見るとよいかもしれません。

    ラズベリー・パイでもいずれ最新版が使えるようになると思います。現在のバージョンは、

    $Version
    

    を評価すれば分かります。手元のラズベリー・パイでは、11.0.1 と出たので、2つ前のバージョンだと思います。



  • @ソム さん
    ご紹介ありがとうございます。
    楽しんでみてます。SHIPWRECK:シシリアあたりは色んな時代の船がたくさん沈んでいます。
    ポエニ戦役時代の物?です。


  • Global Moderator

    @riffraff さん

    Wolframさんがポエニ戦争を調べ出したので、アッ!と思い、紹介してしまいました。沈没船のデータベースなど考えたこともありませんでした。

    ノルマンディ上陸作戦の日の潮汐データを取ってこようとして出てこず、過去のUKの潮汐データが秘密データになっていて得られなかったという話がありましたね。へーと思いました。


  • Global Moderator

     (帰ってきてから何を見てるのかしら?)
    ...ほ~
    ディスプレイ
    0_1554612938651_Turing-Pattern2.gif

    ...ふ~
    ディスプレイ
    0_1554613017523_Turing-Pattern3.gif

     2人で何を見ているの?
     ここへ行ってきたよ。
     (なになに...「ヤマネ大学一般公開」のチラシね)
     ちゅーりんぐ・パターンの作り方を教わってきたの。いま、作ってるところ。
     はて? ちゅーりんぐって何かしら。聞いたこともない。
     知らないよ。チューリップみたいだし、お花のことじゃないからしら。でも、教えてくれた研究室では、お魚の研究をしてるみたいだったけど。
     きっと、リングっぽい模様がチューするから、チュー・リング・パターン。
     さすがサーズディちゃん!
     それで、どうやって作るの?


  • Global Moderator

     それで、どうやって作るの?
     ...えーと、あれを使うの。
     「反応はんのー拡散かくさん方程式ほうてーしきっ」!
     そう、それ! スゴイやつ。
     反応拡散方程式? 何か反応して拡散するのかしら?
     そうなのよ、はんの~ってなって、かくさん~!ってなるの。
     「反応はんのー拡散かくさん方程式ほうてーしきっ」!!!
     ...まあいいわ、式見せてちょうだい。
    ...ぐむむ
    ディスプレイ
    0_1554641289110_Oregonetor2a.gif
     ...あ、あんたたち。聞いてるかしら?



  • @ソム さん
    こちらを連想しました
    ショートバージョン
    https://www.youtube.com/watch?v=PT0ekOMvtak
    ロングバージョン
    https://www.youtube.com/watch?v=rMsLGSSiSPw
    NHKETV朝の番組0655で有名になりました(ごく一部で?(;'∀'))


  • Global Moderator

    @riffraff さん

    ちょっと似てますね。波の発生装置、どこにあるんでしょうか!? あ、2つめの動画のタイトルに「海上技術安全研究所」とありました。深さ5+30=35m、波を消すこともできる!文字造波!

    こういう装置を見ると、仕組みや制御方法が気になります。音を聞いていても造波装置の動作音がほとんどしませんね。速く力強いので、油圧かなんかでしょうか。文字を作るには、128個の造波装置をどのように動かすとよいのか?は面白い問題です。波の重ね合わせと時間の対称性が基本原理でしょうか。



  • @ソム さん
    日本の海上波研究の原点に、哀しい事件があります。貧乏国の無理のつけですす。
    https://ja.wikipedia.org/wiki/友鶴事件
    https://ja.wikipedia.org/wiki/第四艦隊事件
    海事史・造船史・溶接史に残る事件です。


  • Global Moderator

     ...あ、あんたたち。聞いてるかしら?
    ...じゅる
    ディスプレイ
    0_1555154991784_RD_A13.gif
     涎!? ま、いいわ。勝手に見ちゃうから(チラシの横にあった冊子を手に取る)。
    反応拡散方程式
    0_1555155230249_reaction-diffusion-eq.png
     ...ふむふむ、なるほどなるほど U と V の2つの物質があるわけね。その濃度が u と v で表される...。左辺がその濃度の時間変化で、右辺がちょっと複雑な式になってる。なになに、f と g は反応によって u と v がそれぞれ増える速度を表す、と。f と g の関数の中身は、反応の種類によって、いろいろ変る。Du と Dv は U と V それぞれの拡散係数で、▽の記号と合わせて、拡散による変化を表す、と。空間や平面の中での2つの物質の濃度変化を記述している。つまりこういうことね...

    ある場所の U の増える速度 = (その場所で U が反応によって増える速度)+(その場所の U が拡散によって増える速度)
    ある場所の V の増える速度 = (その場所で V が反応によって増える速度)+(その場所の V が拡散によって増える速度)

    ...あばばば
    ディスプレイ
    0_1555155953335_RD_A11.gif
    ......でも、この式から、何か面白いことが起こるのかしらね。UもVも増えるか減るかして、拡散で均一な濃度になるだけじゃないのかしら。
    ...!
    ディスプレイ
    0_1555156067427_RD_A12.gif
    ...それとも、反応の中身に工夫があるのかしら?(手元の冊子をじっとにらむ)



  • @ソム さん
    ふむ(;'∀') むむむ、更に(;'∀')


  • Global Moderator

    ...それとも、反応の中身に工夫があるのかしら?(手元の冊子をじっとにらむ)
    化学反応の例(1)
    0_1555198933748_Gray-Scott-reaction.png

    0_1555198918267_Gray-Scott-eq.png
    Fとkは定数。

    例がいくつか載ってるわね。
    化学反応の例(2)
    0_1555199130490_Brusselator-reaction.png

    0_1555200969619_Brusselator-eq.png
    αとβとγは定数。

    ...化学反応式を速度論でモデル化すると、fとかgのような反応速度を表す式が出てくる。これは、学校で芥子先生が言ってたっけ(何の授業だったかしら?)。

     にょろにょろ~
    ディスプレイ
    0_1555199737084_RD_A14.gif

    ...2つの反応には似ているところもある。でも、特別なことがあるの?


  • Global Moderator

    ...2つの反応には似ているところもある。でも、特別なことがあるの?

     1つめの例が簡単そうなので見てみましょう。
    U + 2V → 3V
    Vが2つ集まってUをVに変換する反応ね。速度式を見ると、この反応だけでは説明のつかない項がある。Fという定数。これは、一定の速度Fで U が系中に増えていることを意味してる。つまり、Uは、反応液の中に一定速度で常に足されているエサと考えると良いわね。そして、Vは酵素みたいなもので、2量体として働いて、エサのUから自分自身Vを作り出すと言う感じかしら。

    V → P
    VがPに変化する反応。速度式を見ると、-k V となっているので、放射性元素の崩壊のように、一定の確率でPに変化するということね。Vが酵素だとすると、酵素が一定の割合で不活化してPになると理解できる。

    ここまでで、反応速度式のだいたいが理解できた。でも、この冊子は不親切ね。これだけではまだ全てに説明が付かない。それは、f(u,v)とg(u,v)のそれぞれにある、-F u、-F v という項。これらは、U, V の両方が同じ確率で反応液から消えていき、その率はUが増える一定速度Fに等しいことを示す。。。つまり、この反応液には、常に一定速度でUを含む液が追加されながら、全体から同量が排出される、一種の連続反応槽をモデル化していることになるわ。

    もともとの反応拡散方程式では、拡散を考慮しているけど、移流項(流れによる移動を表す項)はない。だから、攪拌されているわけではない。反応液全体から均一に排出することは難しいと思うけど、何か反応装置に工夫するのかしらね。まあ、うちのおじちゃんあたりなら、何とかしそうだわ、ぶつぶつ...

     ウェンズディちゃんもこっちに来たらいいのに...

     まあいいわ。速度式を正しいものとして見ましょう。何が起こるかしら?


  • Global Moderator

    ラズベリー・パイを使って、Mathematica で遊ぼう!@ソム が発言 :

    文字を作るには、128個の造波装置をどのように動かすとよいのか?

    海上技術安全研究所のページに研究紹介がありました。
    波の芸術
    https://www.nmri.go.jp/news/toics/wave_art.html

    規則的な波でなく、三角波(一発大波)の時間制御を行うようです。

    ついでに、文末に382台の造波機を並べた長方形の実海域再現水槽に言及があります。ここで用いられる造波機は、元の動画の深海水槽の造波機と見た目はにています。
    https://www.jstage.jst.go.jp/article/jime/48/6/48_776/_pdf
    ↑の記事によると、造波機はフラップ式(板を傾けて動かして波を作る方式)で、ACサーボモーター、ボールネジ駆動であるそうです。

    深海水槽のほうも駆動方法が同じなら、油圧でなく、電動であったということになります。ACサーボーモーター+ボールネジ駆動は、NC工作機(フライス盤など)でよく用いられる方法です。ボールネジとは、ネジとベアリングを合成したような優れもので、摩擦が小さく、精密で、剛性の高い駆動ができます。油圧ピストン・油圧ジャッキ的なもので駆動していると予想していたので、意外です。


  • Global Moderator

     まあいいわ。速度式を正しいものとして見ましょう。何が起こるかしら?

     ややこしいものに取り組むときは、一歩一歩よ。まず地図作りからね。UとVの濃度がある値のときに、反応によってどう変化するか? 知るためには、そのときの g と f それぞれの符号が分かればよい。

    f < 0 f = 0 0 < f
    g < 0 UもVも減る Uは変らず、Vは減る Uは増えるが、Vは減る
    g = 0 Uは減り、Vは変らず UもVも変らず Uは増え、Vは変らず
    0 < g Uは減るが、Vは増える Uは変らず、Vは増える UもVも増える

    特に、f = 0 や g = 0 になる濃度は、特徴的と言えるわ。その中でも特に同時に f = g = 0 となる濃度があれば、もう反応による変化起こらないということだから、安定濃度になる。パラメータを1つに決めて f と g のプロットをしてみましょう。1つのプロットは、f = 0, g = 0の濃度、もう一つのプロットは、標高のようにして、f と g を表してみる。
    0_1555243545458_nullcline-F003-k0063.png
    左:f =0, g=0(2つある)となる濃度(u, v)。f = g = 0 となる交点を黒丸で示す。
    右:濃度 (u, v)のときの f (黄)、g(青)の大きさを高さで表す。緑は、高さ = 0 の面。

     さて何がわかるかしらね。

    Mathematica
    Solve[-u v^2 + feed (1 - u) == 0, v]
    
    Solve[u v^2 - (feed + kill) v == 0, v]
    
    Module[{feed = 0.03, kill = 0.063},
     {Plot[{Sqrt[feed - feed u]/Sqrt[u], (feed + kill)/u, 0}, {u, 0, 1.5},
       AxesLabel -> {"u", "v"}, BaseStyle -> {FontSize -> 16}, 
       ImageSize -> 300,
       PlotLegends -> {"f=0", "g=0", "g=0"}, 
       PlotStyle -> (ColorData[97, "ColorList"][[#]] & /@ {2, 1, 
           3})(*Plot3Dと色を合わせる*),
       Epilog -> {Text["F=" <> ToString@feed <> "\nk=" <> ToString[kill], 
          Scaled[{0.75, 0.75}], Alignment -> Left],
         PointSize[Medium], Point[{1, 0}]},
       PlotRange -> {{-0.1, 1.2}, {-0.1, 1.2}}, AspectRatio -> 1],
      Plot3D[{-u v^2 + feed (1 - u), u v^2 - (feed + kill) v, 0}, {u, 0, 
        1.2}, {v, 0, 1.2},
       AxesLabel -> {"u", "v", ""}, PlotPoints -> 20,
       ViewPoint -> {0.5556550603030389, -1.7001159452008137`, 
         2.8724298471561607`}, ViewVertical -> {0., 0., 1.}, 
       ImageSize -> 350]
      }
     ]
    

    訂正:色の対応が違っていたのを修正しました。


  • Global Moderator

     さて何がわかるかしらね。

     地図を見ながら、それぞれの濃度 (u,v) の領域で、濃度が変化する方向を矢印で書いてみる。変化の方向は先に作った表を見ながらね。

    0_1555245811201_nullcline-arrows.png

    こうなるかしら。線の上からスタートしたときどちらに変化するかも書いてみる。

     ①の領域にある濃度の組合わせから反応を始めたとしましょう。すると左上のほうに変化していく。そして、青線にぶつかるわね。すると左に動き、②の領域に入る。②の領域では左下に動くので、場所によるけど、黄色の線にぶつかるわ。そこでは下に動くので、③の領域に入る。③の領域では、右下へ動く。すると緑線にぶつかって、緑線では右に動くので、(u, v) = (1, 0) の黒点にぶつかるまで動くはずね。この点は安定点なので、来たらもう濃度は変化しなくなる。②の領域の、右下で始めると、ちょっと違うわね。まず左下に動いて、緑線にぶつかる、そして左へ動いて、やっぱり (u, v) = (1, 0)で止っちゃうわ。これ以外のケースはなさそうね。つまり、どこから始めても、最終的に (1, 0)になって、反応は終りってことか。

     本当かどうか、ちょっと試しに濃度変化の軌跡を見てみましょう。例えば、(u, v) = (0.5, 0.5) から始めて、f, g を計算しながら、ちょっとずつ濃度を更新していく。その濃度変化を点列として結ぶと軌跡が得られるはずよ。
    0_1555246072121_nullcline-F003-k0063-trace05_05.png
    赤線が軌跡。

    Mathematica
    Module[{feed = 0.03, kill = 0.063, start = {0.5, 0.5},
      f, g, next, trace},
     f[u_, v_] := u + dt (-u v^2 + feed (1 - u));
     g[u_, v_] := v + dt (u v^2 - (feed + kill) v);
     next[{u1_, v1_}, 
       dt1_] := {f[u, v], g[u, v]} /. {u -> u1, v -> v1, dt -> dt1};
     
     trace = NestList[next[#, 0.5] &, start, 500];
     Plot[{Sqrt[feed - feed u]/Sqrt[u], (feed + kill)/u, 0}, {u, 0, 1.5},
      AxesLabel -> {"u", "v"}, BaseStyle -> {FontSize -> 16}, 
      ImageSize -> 300,
      PlotLegends -> {"f=0", "g=0", "g=0"}, 
      PlotStyle -> (ColorData[97, "ColorList"][[#]] & /@ {2, 1, 
          3})(*Plot3Dと色を合わせる*),
      Epilog -> {Text["F=" <> ToString@feed <> "\nk=" <> ToString[kill], 
         Scaled[{0.75, 0.75}], Alignment -> Left],
        PointSize[Medium], Point[{1, 0}], Red, Point@start, Line@trace},
      PlotRange -> {{-0.1, 1.2}, {-0.1, 1.2}}, AspectRatio -> 1
      ]
     ]
    

     やっぱりそうね、ぐるっと動いて、最後は黒丸デッドエンド。ふふふ。
     ちょっとちょっと、サーズディちゃん、サンディちゃん!
     どおしたの、さっきからぶつぶつと独り言。
     試して欲しいことがあるの。ここにあるパラメータの値を入れて、2人の見ている反応を動かしてみて欲しいの。Uの濃度が0にちかいときは青、1に近いときは赤で、間の濃度は白っぽくね。最後は全体が真っ赤になって終わるはずよ。初期値は適当に入れといて。
     (かちゃかちゃ←コンピューターに打ち込む音)ほいさ。
    ディスプレイ (F = 0.03, k = 0.063)

     !



  • 0_1555254251870_a72f9b09-f957-4c02-9aad-250d2589c25a-image.png ちゃん

    あらあら!(^^)!



Looks like your connection to パズルハウス was lost, please wait while we try to reconnect.