0
Scala で描く力学系の世界 gumowski-mira 写像と関数プログラミング 山本修司
概要 <ul><li>自己紹介
お絵かき
Scala
力学系
Streamプログラミング
Gumowski-mira写像
簡易Gumowski-mira写像(仮称)
Gingerbread Man写像
まとめ </li></ul>
自己紹介 <ul><li>山本修司
Twitter :appleeatery
Pixiv :1104184 (id:yamasushi)
兵庫県赤穂市から来ました </li></ul>
赤穂はココ
ただいま休業中 <ul><li>パソコンボランティア </li><ul><ul><li>シニア向けパソコン教室の講師修行中
赤穂インターネット協議会
http://www.ako-i.net/ </li></ul></ul></ul>
お絵かき <ul><li>「 点を打つ 」+「 画像ファイル生成 」 </li><ul><li>線も円も 点 の集合
点 が打てればなんでも描ける </li></ul></ul>
GUIは必要ない <ul><li>画像ファイルビューワがあれば十分です </li></ul>
Scala <ul><li>JVM上の言語の一つ </li><ul><li>作者はMartin Odersky、 ドイツ産まれドイツ育ち </li><ul><li>研究者人生を 構造化プログラミング からスタート </li><ul><li>Mo...
いろいろあって 、Scala開発にいたる </li></ul></ul></ul>SE Radio : Martin Odersky on Scala http://odeo.com/episodes/24094607-Episode-62-M...
Scala <ul><li>言語のざっくりとした特徴 </li><ul><li>関数プログラミングとオブジェクト指向の融合 </li><ul><li>副作用を許容
Better Javaとして使える
関数言語としても妥協なし </li></ul><li>簡潔な記述 </li><ul><li>冗長な記述の排除 </li></ul></ul></ul>
ScalaKaigi(仮)計画進行中 <ul><li>西本さん(@keisuke_n)の呼びかけで、ScalaKaigi開催を計画中です。
Google Waveというもので打ち合わせをしているそうです。
ただいま、協力者を募集中。続きはWebで
http://cappuccino.jp/keisuken/logbook/20091203.html#p01 </li></ul>
ベクトルを定義してみる trait Vector[T] { def apply(i:Int):T lazy val x = apply(0) lazy val y = apply(1) lazy val z = apply(2) } <ul><...
x,y,zは特定の添え字の別名 </li></ul>※ この定義で無限次元ベクトルも定義できている  (逆に次元をどう定義するかが課題) ※  関数のベクトルも定義可能 ※  行列はベクトルのベクトルとして定義 ※ ベクトル演算については省略 ...
object Vector { def apply[T](xs:T*)  : Vector[T] = s2v(xs) implicit def f2v[T]( v:(Int)=>T ) : Vector[T] = new Vector[T]{ ...
力学系 <ul><li>wikipedia(日本語)より </li></ul>力学系 (りきがくけい)( dynamical system )とは、一定の規則に従って時間の経過とともに状態が変化するシステム(系)、あるいはそのシステムを記述する...
点を打つ <ul><li>点列の生成に 離散力学系 を使います </li></ul>初期値
<ul>離散力学系 = 無限リスト </ul><ul><li>プログラミングと数学の出会い </li></ul>mapDIfference を差分方程式、 pt0 を初期値として、 無限リスト を scala の Stream で表現すると: ...
無限リストとStream <ul><li>一定のルールで無限につづく列を表す技法 </li><ul><li>遅延評価 を使って無限を表す </li><ul><li>“Structure and Interpretation of Compute...
3.5 Streams </li></ul></ul><li>リストのhead(=car),tail(=cdr)を抽象化 </li><ul><li>headを取得で要素を得る
tailを取得するタイミングで評価する(遅延評価) </li></ul></ul>SICP chap. 2 Building Abstractions with Data に考え方の基礎が説明してあります
無限リストとStream <ul>簡易記法で表してみると: <li>S = p0 |  F( S )
F( S ) = F(head(S)) | F(tail(S))
= F( p0 ) |  F( F(S) )
F( F(S) ) = F(head(F(S))|F(tail(F(S)))
=F( F(p0) ) | F( F(F(S)) ) </li></ul>※ 一つ前がわかれば、計算できる
無限リストとStream 遅延評価の雰囲気だけ感じてもらえば・・・(汗
Streamプログラミング trait ChaosSystem { val limitPositive =  1.0e20 val limitNegative = -limitPositive // def mapDifference(p:Ve...
def pointsFrom(dropIter:Int,maxIter:Int)( pt0:Vector[Double] ) : Stream[(Int,Vector[Double])] = { ( Stream.from(-dropIter)...
object ParamRange { def apply(start:Double,end:Double,step:Double) :   Stream[Double] = { val boundary : (Double) => Boole...
落とし穴 <ul><li>Lazy val と def </li></ul>object Main extends Application { lazy val s1:Stream[Int] = Stream.cons( 1 , s1.map(...
落とし穴 <ul><li>乱数列をつくるには </li></ul>object Main extends Application { lazy val s1:Stream[Int] = Stream.cons(  (Math.random * ...
Gumowski-mira写像 <ul><li>1980年にGumowskiとMiraが発明
二次元 離散力学系
生物に似た形を生成 </li></ul>
Gumowski-mira写像 a,b は固定して、 μ を動かします (a=0.008 , b=0.05 ) Computer Simulation on the Gumowski-Mira Transformation Kenji OTSU...
μ=-0.9
Upcoming SlideShare
Loading in...5
×

Scalaで描く力学系の世界@オープンラボ岡山(2009年12月19日)

1,910

Published on

2009/12/19のオープンラボ岡山での発表資料。gumowski-mira写像とその眷属について。

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,910
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Scalaで描く力学系の世界@オープンラボ岡山(2009年12月19日)"

  1. 1. Scala で描く力学系の世界 gumowski-mira 写像と関数プログラミング 山本修司
  2. 2. 概要 <ul><li>自己紹介
  3. 3. お絵かき
  4. 4. Scala
  5. 5. 力学系
  6. 6. Streamプログラミング
  7. 7. Gumowski-mira写像
  8. 8. 簡易Gumowski-mira写像(仮称)
  9. 9. Gingerbread Man写像
  10. 10. まとめ </li></ul>
  11. 11. 自己紹介 <ul><li>山本修司
  12. 12. Twitter :appleeatery
  13. 13. Pixiv :1104184 (id:yamasushi)
  14. 14. 兵庫県赤穂市から来ました </li></ul>
  15. 15. 赤穂はココ
  16. 16. ただいま休業中 <ul><li>パソコンボランティア </li><ul><ul><li>シニア向けパソコン教室の講師修行中
  17. 17. 赤穂インターネット協議会
  18. 18. http://www.ako-i.net/ </li></ul></ul></ul>
  19. 19. お絵かき <ul><li>「 点を打つ 」+「 画像ファイル生成 」 </li><ul><li>線も円も 点 の集合
  20. 20. 点 が打てればなんでも描ける </li></ul></ul>
  21. 21. GUIは必要ない <ul><li>画像ファイルビューワがあれば十分です </li></ul>
  22. 22. Scala <ul><li>JVM上の言語の一つ </li><ul><li>作者はMartin Odersky、 ドイツ産まれドイツ育ち </li><ul><li>研究者人生を 構造化プログラミング からスタート </li><ul><li>Modula-2 など </li></ul><li>世界の研究所を行脚 </li><ul><li>アメリカ、オーストラリア、スイス・・・ </li></ul><li>関数プログラミング の研究の世界に
  23. 23. いろいろあって 、Scala開発にいたる </li></ul></ul></ul>SE Radio : Martin Odersky on Scala http://odeo.com/episodes/24094607-Episode-62-Martin-Odersky-on-Scala
  24. 24. Scala <ul><li>言語のざっくりとした特徴 </li><ul><li>関数プログラミングとオブジェクト指向の融合 </li><ul><li>副作用を許容
  25. 25. Better Javaとして使える
  26. 26. 関数言語としても妥協なし </li></ul><li>簡潔な記述 </li><ul><li>冗長な記述の排除 </li></ul></ul></ul>
  27. 27. ScalaKaigi(仮)計画進行中 <ul><li>西本さん(@keisuke_n)の呼びかけで、ScalaKaigi開催を計画中です。
  28. 28. Google Waveというもので打ち合わせをしているそうです。
  29. 29. ただいま、協力者を募集中。続きはWebで
  30. 30. http://cappuccino.jp/keisuken/logbook/20091203.html#p01 </li></ul>
  31. 31. ベクトルを定義してみる trait Vector[T] { def apply(i:Int):T lazy val x = apply(0) lazy val y = apply(1) lazy val z = apply(2) } <ul><li>ベクトルとは、添え字に対する関数のようなもの
  32. 32. x,y,zは特定の添え字の別名 </li></ul>※ この定義で無限次元ベクトルも定義できている  (逆に次元をどう定義するかが課題) ※ 関数のベクトルも定義可能 ※ 行列はベクトルのベクトルとして定義 ※ ベクトル演算については省略 ( 汗   (scala2.8 になると簡単に定義可能 )
  33. 33. object Vector { def apply[T](xs:T*) : Vector[T] = s2v(xs) implicit def f2v[T]( v:(Int)=>T ) : Vector[T] = new Vector[T]{ def apply(i:Int) = v(i) } implicit def s2v[T]( v:Seq[T]) : Vector[T] = new Vector[T]{ def apply(i:Int) = v(i) } implicit def t2v[T](v:(T,T)) : Vector[T] = new Vector[T]{ def apply(i:Int):T = i match { case 0 => v._1 case 1 => v._2 } } implicit def t2v[T](v:(T,T,T)) : Vector[T] = new Vector[T]{ def apply(i:Int):T = i match { case 0 => v._1 case 1 => v._2 case 2 => v._3 } } // }
  34. 34. 力学系 <ul><li>wikipedia(日本語)より </li></ul>力学系 (りきがくけい)( dynamical system )とは、一定の規則に従って時間の経過とともに状態が変化するシステム(系)、あるいはそのシステムを記述するための数学的なモデルのことである。 一般には状態の変化に影響を与える数個の要素を変数として取り出し、要素間の相互作用を 微分方程式 または 差分方程式 として記述することによってモデル化される。 今回扱うのは、差分方程式を使う「離散力学系」です
  35. 35. 点を打つ <ul><li>点列の生成に 離散力学系 を使います </li></ul>初期値
  36. 36. <ul>離散力学系 = 無限リスト </ul><ul><li>プログラミングと数学の出会い </li></ul>mapDIfference を差分方程式、 pt0 を初期値として、 無限リスト を scala の Stream で表現すると: lazy val sys :Stream[Vector[Double]] = Stream. cons ( pt0 , sys .map( mapDifference ) ) ※ 全体がシフトしていると解釈できます
  37. 37. 無限リストとStream <ul><li>一定のルールで無限につづく列を表す技法 </li><ul><li>遅延評価 を使って無限を表す </li><ul><li>“Structure and Interpretation of Computer Programs”
  38. 38. 3.5 Streams </li></ul></ul><li>リストのhead(=car),tail(=cdr)を抽象化 </li><ul><li>headを取得で要素を得る
  39. 39. tailを取得するタイミングで評価する(遅延評価) </li></ul></ul>SICP chap. 2 Building Abstractions with Data に考え方の基礎が説明してあります
  40. 40. 無限リストとStream <ul>簡易記法で表してみると: <li>S = p0 | F( S )
  41. 41. F( S ) = F(head(S)) | F(tail(S))
  42. 42. = F( p0 ) | F( F(S) )
  43. 43. F( F(S) ) = F(head(F(S))|F(tail(F(S)))
  44. 44. =F( F(p0) ) | F( F(F(S)) ) </li></ul>※ 一つ前がわかれば、計算できる
  45. 45. 無限リストとStream 遅延評価の雰囲気だけ感じてもらえば・・・(汗
  46. 46. Streamプログラミング trait ChaosSystem { val limitPositive = 1.0e20 val limitNegative = -limitPositive // def mapDifference(p:Vector[Double]) : Vector[Double] def mapCoordinate(p:Vector[Double]) : Vector[Double] = {p} def validateParam() : Boolean = { true } // def from( pt0:Vector[Double] ) : Stream[Vector[Double]] = { lazy val sys :Stream[Vector[Double]] = Stream.cons( pt0 , sys .map(mapDifference) ) sys takeWhile(limitCheck) map(mapCoordinate) } // def limitCheck(p:Vector[Double]) : Boolean = { ( limitNegative < p.x && limitPositive > p.x && limitNegative < p.y && limitPositive > p.y ) } }
  47. 47. def pointsFrom(dropIter:Int,maxIter:Int)( pt0:Vector[Double] ) : Stream[(Int,Vector[Double])] = { ( Stream.from(-dropIter) zip chaosSystem.from(pt0) ) take( dropIter + maxIter ) } -dropIter から始まる無限整数 列 pt0 を初期値とする力学系の無限点列 (dropIter+maxIter) だけ取り出す Zip
  48. 48. object ParamRange { def apply(start:Double,end:Double,step:Double) : Stream[Double] = { val boundary : (Double) => Boolean = if(step<0) { _ >= end } else { _ <= end } from( start , step ) takeWhile boundary } def from(start:Double,step:Double) : Stream[Double] = { if (step==0) Stream.cons(start,Stream.empty) else Stream.cons(start,from(start+step,step)) } def neighbor(t:Double,tStep:Double,nRadius :Int) : Stream[Double] = { val zero = from(t, 0) val plus = (from(t,+tStep) drop 1 ) take nRadius val minus = (from(t,-tStep) drop 1 ) take nRadius Stream.concat( zero , plus , minus ) } }
  49. 49. 落とし穴 <ul><li>Lazy val と def </li></ul>object Main extends Application { lazy val s1:Stream[Int] = Stream.cons( 1 , s1.map(f) ) def s2:Stream[Int] = Stream.cons( 1 , s2.map(f) ) (s1.take(10)).print (s2.take(10)).print def f(t:Int) : Int = {print(&quot;f&quot;) ; t + 2} } 1, f3, f5, f7, f9, f11, f13, f15, f17, f19, Stream.empty 1, f3, ff5, fff7, ffff9, fffff11, ffffff13, fffffff15, ffffffff17, fffffffff19, Stream.empty ※ 評価の仕方が違う!とんでもなく効率が悪くなるので注意しましょう
  50. 50. 落とし穴 <ul><li>乱数列をつくるには </li></ul>object Main extends Application { lazy val s1:Stream[Int] = Stream.cons( (Math.random * 200).toInt - 100 , s1 ) def s2:Stream[Int] = Stream.cons( (Math.random * 200).toInt - 100 , s2 ) (s1.take(10)).print (s2.take(10)).print } 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, Stream.empty -82, 17, 32, 48, 97, -9, -3, 2, -97, 17, Stream.empty ※ lazy val は一度計算した値は再計算しません
  51. 51. Gumowski-mira写像 <ul><li>1980年にGumowskiとMiraが発明
  52. 52. 二次元 離散力学系
  53. 53. 生物に似た形を生成 </li></ul>
  54. 54. Gumowski-mira写像 a,b は固定して、 μ を動かします (a=0.008 , b=0.05 ) Computer Simulation on the Gumowski-Mira Transformation Kenji OTSUBO, Masakazu WASHIDA, Takao ITOH, Kazuo KATSUURA and Masaki HAYASHI http://www.scipress.org/journals/forma/pdf/1502/15020121.pdf
  55. 55. μ=-0.9
  56. 56. μ = -0.8
  57. 57. μ=0.25
  58. 58. μ=-0.475
  59. 59. Gumowski-mira写像 ・点の変換の定義が関数だけになった ・ π,ψ をいじるといい事あるかも <ul>少し、一般化してみよう </ul>
  60. 60. <ul><li>μ=-0.475 </li></ul>
  61. 61. <ul><li>μ=-0.475 </li></ul>
  62. 62. Gumowski-mira写像 <ul>他にもいろいろできそうですね </ul>パラメータを調整しないと図形が発散したり、つまらない図形に収束したりします
  63. 63. 佐藤さんの簡易Gumowski-mira写像 <ul>佐藤元さんのサイトより </ul>http://www.ny.airnet.ne.jp/satoh/chaos.htm
  64. 64. 簡易Gumowski-mira写像(仮称) <ul>一般化します </ul>
  65. 65. <ul><li>a=-0.90000
  66. 66. b=0.96000
  67. 67. c=-4.00000
  68. 68. d=0.00000 </li></ul>
  69. 69. <ul><li>a=-0.90000
  70. 70. b=0.96000
  71. 71. c=-4.00000
  72. 72. d=1.00000 </li></ul>
  73. 73. 簡易Gumowski-mira写像(仮称) <ul><li>他のパラメータも調べてみると </li><ul><li>図形が 45 度傾いている
  74. 74. A の値の大きさに反比例して幅が変わる </li></ul></ul>表示時に座標変換する
  75. 75. 座標変換クロージャ生成 <ul><li>135度回転して、aの値を見て偏倍 </li></ul>val (a,b,c,d) = param val ratio = abs(a)+1 val theta = (3*Math.Pi)/4.0 if (a>= 0) { p => scale(ratio, 1)(rotate(theta)(p) ) } else { p => scale(1 ,ratio)(rotate(theta)(p) ) } 変換関数
  76. 76. <ul><li>a=-0.90000
  77. 77. b=0.96000
  78. 78. c=-4.00000
  79. 79. d=1.00000 </li></ul>
  80. 80. <ul><li>a=-0.90000
  81. 81. b=0.96000
  82. 82. c=-4.00000
  83. 83. d=0.90000 </li></ul>
  84. 84. <ul><li>a=0.34000
  85. 85. b=1.00000
  86. 86. c=1.00000
  87. 87. d=0.00000 </li></ul>
  88. 88. <ul><li>a=0.0
  89. 89. b=1.00000
  90. 90. c=1.00000
  91. 91. d=0.00000 </li></ul>
  92. 92. <ul><li>a=0.1
  93. 93. b=1.00000
  94. 94. c=1.00000
  95. 95. d=0.00000 </li></ul>
  96. 96. 簡易 Gumowski-mira 写像 ( 仮称 ) <ul>他にもいろいろできそうですね </ul>簡易版 gumowski-mira の方が、変な図形を形成しやすいみたいです
  97. 97. Gingerbread Man写像 <ul><li>絶対値を使った力学系 </li></ul>Devaney, R. L &quot;A Chaotic Gingerbreadman.&quot; ( カオスのジンジャーブレッドマン ) The Science of Fractal Images §3.2.3 ( 邦訳「フラクタルイメージ 理論とプログラミング」 ) http://en.wikipedia.org/wiki/Gingerbreadman_map http://mathworld.wolfram.com/GingerbreadmanMap.html http://sprott.physics.wisc.edu/FRACTALS/booktext/sabook.pdf
  98. 99. <ul><li>-135 度回転して表示 </li></ul>
  99. 100. Gingerbread Man 写像 <ul><li>ちょっとだけ一般化 </li></ul>
  100. 101. <ul><li>μ=1.1 </li></ul>
  101. 102. ふたたび簡易 Gumowski-Mira( 仮称 )
  102. 103. ふたたび簡易Gumowski-Mira(仮称) Gingerbread Man 写像
  103. 104. <ul><li>a=0.00000
  104. 105. b=1.00000
  105. 106. c=-1.00000
  106. 107. d=-1.00000 </li></ul>※ ( a=0 なので 偏倍なしで )135 度回転
  107. 108. まとめ ? <ul><li>関数プログラミング例としての力学系 </li><ul><li>Stream で無限を表現 </li><ul><li>ご利用は計画的に </li></ul><li>関数をいろいろ操作 </li><ul><li>クロージャ・関数リテラルを活用 </li></ul></ul></ul>
  108. 109. ご清聴ありがとうございます
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×