?

Log in

No account? Create an account

Previous Entry | Next Entry

IFS

Не спалось, построил — чтобы уснуть. Не помогло, зато красиво. Тыцайте до полного размера 600×1000 (40 КБ). Хорошо известная формула, 600 тысяч итераций.



Исходный код, Mathematica 6.0, сырой и неоптимальный. Скорость примерно 10000 итер/сек на P4 2.8 MHz. Уменьшите размер пиксела до 0.001 и увеличьте изображение до 600,1000, чтобы повторить картинку в точности.
TFun[a_?MatrixQ, b_?VectorQ] := Compile[{{x, _Real, 1}}, {a.x + b}];

(* Prepare a set of function for quick retrieval.
   The resulting list has an accrued weight as the first element of each
   nested list, so that the first one that's >= random_num can be chosen *)
TFunSet[t_, w_] := Block[{a, p, s, q},
   {p, a} = Transpose[w];              (* {weight, {fun arg..}}..  *)
   p = Accumulate[p]/Plus @@ p;        (* Normalize weights to 1   *)
   MapThread[{#1,t @@ #2}&,{p, a}]];   (* To {weight bound, fun}.. *) 

(* Select а random function from the given TFunSet *)
TSetSelect[set_] := Block[{r = RandomReal[]},
   Select[set, First[#] >= r &, 1][[1, 2]]];

(* Use the above and apply the resulting function to the vector x *)
TSetApply[set_, x_] := First[TSetSelect[set][x]]

Block[{
  ITER = 10000,
  tset = TFunSet[TFun, {
     {0.01, {{{0, 0}, {0, 0.16}}, {0, 0}}},
     {0.85, {{{0.85, 0.04}, {-0.04, 0.85}}, {0, 1.6}}},
     {0.07, {{{0.22, -0.26}, {0.23, 0.22}}, {0, 1.6}}},
     {0.07, {{{-0.15, 0.28}, {0.26, 0.24}}, {0, 0.44}}}
     }]},

 Rasterize @ ListPlot[NestList[TSetApply[tset, #] &, {0, 0}, ITER],
   PlotStyle -> {PointSize[0.005], RGBColor[0, 7/8, 0]},
   ImageSize -> {300, 500},
   AspectRatio -> Full
   ]]


Хозяйке на заметку. Без Rasterize[...] результат будет очень громоздким, и Front End будет его долго форматировать, а так он превращается в растровое изображение еще в ядре, и отрисовывается моментально.

Comments

( 31 comments — Leave a comment )
mr_finder
Oct. 3rd, 2008 10:52 pm (UTC)
Красиво.
rwalk
Oct. 3rd, 2008 10:56 pm (UTC)
тут сколько функций? забыл уже
fregimus
Oct. 4th, 2008 12:10 am (UTC)
Четыре. Я формулы из этой статьи взял: http://www.cs.wlu.edu/~levy/pubs/bics2004.pdf
rwalk
Oct. 4th, 2008 06:39 am (UTC)
Вы имеете в виду, что точек 600000, а итераций же наверное около 10? Кстати, интереснее было бы визуализировать саму меру, а не ее носитель. Таких картинок не припомню.
(no subject) - fregimus - Oct. 4th, 2008 07:24 am (UTC) - Expand
(no subject) - rwalk - Oct. 4th, 2008 07:41 am (UTC) - Expand
(no subject) - fregimus - Oct. 4th, 2008 08:12 am (UTC) - Expand
(no subject) - rwalk - Oct. 4th, 2008 08:38 am (UTC) - Expand
(no subject) - fregimus - Oct. 4th, 2008 10:11 am (UTC) - Expand
(no subject) - rwalk - Oct. 4th, 2008 11:05 am (UTC) - Expand
(no subject) - rwalk - Oct. 4th, 2008 11:36 am (UTC) - Expand
(no subject) - fregimus - Oct. 4th, 2008 11:37 pm (UTC) - Expand
(no subject) - rwalk - Oct. 5th, 2008 07:33 am (UTC) - Expand
(no subject) - mops - Oct. 4th, 2008 09:09 am (UTC) - Expand
(no subject) - fregimus - Oct. 4th, 2008 10:17 am (UTC) - Expand
(no subject) - fregimus - Oct. 4th, 2008 11:38 pm (UTC) - Expand
(no subject) - arno1251 - Oct. 9th, 2008 09:34 am (UTC) - Expand
(no subject) - fregimus - Oct. 9th, 2008 10:14 am (UTC) - Expand
Cuneintel - arno1251 - Oct. 9th, 2008 10:20 am (UTC) - Expand
yurvor
Oct. 4th, 2008 12:01 am (UTC)
А представляешь, кто-то вот так же над каждым листиком - по 600 тысяч итераций...

;)
fregimus
Oct. 4th, 2008 12:12 am (UTC)
Учитывая 4 млрд. лет эволюции, примерно где-то так и выходит.
yurvor
Oct. 6th, 2008 04:05 am (UTC)
Не-не-не, эволюция тут ни при чём :) Я имею в виду "рисование" каждого листика у конкретной травки у тебя под окном... или у меня :)
(no subject) - fregimus - Oct. 6th, 2008 05:55 am (UTC) - Expand
f_andrey
Oct. 4th, 2008 01:31 am (UTC)
Красота :)
m_ustinov
Oct. 4th, 2008 07:49 am (UTC)
Здорово!
umab_c_pex
Oct. 4th, 2008 02:21 pm (UTC)
узкие длинные перистые листики... эк как торкнуло-то :)
fregimus
Oct. 4th, 2008 11:46 pm (UTC)
Это папоротник! Его курить не надо!!!
umab_c_pex
Oct. 5th, 2008 02:49 pm (UTC)
папоротник??? значит это меня торкнуло :)
vadim_kataev
Oct. 5th, 2008 01:52 am (UTC)
на хаскеле ещё короче получится
fregimus
Oct. 6th, 2008 05:58 am (UTC)
Такой цели у меня не было (пожалуй, ни разу никогда не было: объектный код уменьшить хотелось, исходный — не припомню, чтобы). К тому же, код здесь вообще не стоит обсуждения.

Edited at 2008-10-06 05:58 am (UTC)
irina8708
Mar. 2nd, 2009 06:11 pm (UTC)
Здраствуйте!Здорово!А не поделитесь программкой построения папоротника! То что вы выложили почему-то не работает, выводит только координатные линии! Заранее благодарю iren_a@list.ru
( 31 comments — Leave a comment )