Wolfram
Mathematica
8의 신기능: 빠른 컴파일 함수 기능
◄
이전
|
다음
►
소프트웨어 개발
Mandelbrot 집합 살펴보기
연산 시간의 속도 향상으로, 오랜 시간이 걸리던 연산을 이제는 실시간으로 바로 연산할 수 있게 되었습니다.
Mandelbrot 집합을 상세히 살펴 봅니다.
빠른 연산 속도로 시각화 결과를 인터랙티브하게 볼 수 있습니다.
Mathematica
문법을 이용함으로써 작업 시간의 속도를 높일 수 있습니다.
In[1]:=
X
mandelComp = Compile[{{c, _Complex}}, Module[{num = 1}, FixedPoint[(num++; #^2 + c) &, 0, 800, SameTest -> (Re[#]^2 + Im[#]^2 >= 4 &)]; num], CompilationTarget -> "C", RuntimeAttributes -> {Listable}, Parallelization -> True]; With[{x = 0, y = 1, draghold = {0.0524687, 0.749809}}, Panel[ Module[{dragstart = {0, 0}, dragval = {0, 0}, xrange, yrange, m = 10.2, scale = 0.000850147}, {xshift, yshift} = (dragstart - dragval + draghold) {1, -1}; {ylo, yhi} = yshift + scale*{-1, 1}; {xlo, xhi} = xshift + scale*{-1, 1}; xrange = {b, xlo, xhi, .0025 scale}; yrange = {a, ylo, yhi, .0025*scale}; data = Table[a + I b, Evaluate[yrange], Evaluate[xrange]]; ArrayPlot[mandelComp[data], ImageSize -> 300] ] ] ]
Out[1]=
In[2]:=
X
mandelComp = Compile[{{c, _Complex}}, Module[{num = 1}, FixedPoint[(num++; #^2 + c) &, 0, 30, SameTest -> (Re[#]^2 + Im[#]^2 >= 4 &)]; num], CompilationTarget -> "C", RuntimeAttributes -> {Listable}, Parallelization -> True]; doPlotDrag[{x_, y_}] := Panel[ DynamicModule[{dragstart = {0, 0}, dragval = {0, 0}, draghold = {x, y}, xrange, yrange, m = -Log[2, 1.5], scale = 1.5}, Column[{ Row[{"Zoom ", Slider[Dynamic[m, Function[scale = 2.^-#; m = #]], {-1, 50}], Dynamic[m]}], EventHandler[ Dynamic[{xshift, yshift} = (dragstart - dragval + draghold) {1, -1}; {ylo, yhi} = yshift + scale*{-1, 1}; {xlo, xhi} = xshift + scale*{-1, 1}; xrange = {b, xlo, xhi, .01 scale}; yrange = {a, ylo, yhi, .01*scale}; data = Table[a + I b, Evaluate[yrange], Evaluate[xrange]]; ArrayPlot[mandelComp[data], ImageSize -> 300]], "MouseDown" :> (dragval = dragstart = scale*MousePosition["GraphicsScaled"]), "MouseDragged" :> (dragval = scale*MousePosition["GraphicsScaled"]), "MouseUp" :> (draghold = draghold + dragstart - dragval; dragstart = dragval = {0, 0})]}]] ] doPlotDrag[{0, 1}]
Out[2]=
In[3]:=
X
mandelComp = Compile[{{c, _Complex}, {ii, _Real}}, Module[{num = 1}, FixedPoint[(num++; #^ii + c) &, 0, 30, SameTest -> (Re[#]^2 + Im[#]^2 >= 4 &)]; num], CompilationTarget -> "C", RuntimeAttributes -> {Listable}, Parallelization -> True]; doPlotDrag[{x_, y_}] := Panel[ DynamicModule[{dragstart = {0, 0}, dragval = {0, 0}, draghold = {x, y}, xrange, yrange, m = -Log[2, 1.5], scale = 2.0, ii = 2.0}, Column[{ Row[{"Power ", Slider[Dynamic[ii], {1.0, 10.0, 0.001}], Dynamic[ii]}], Row[{"Zoom ", Slider[Dynamic[m, Function[scale = 2.^-#; m = #]], {-1, 50}], Dynamic[m]}], EventHandler[ Dynamic[{xshift, yshift} = (dragstart - dragval + draghold) {1, -1}; {ylo, yhi} = yshift + scale*{-1, 1}; {xlo, xhi} = xshift + scale*{-1, 1}; xrange = {b, xlo, xhi, .01 scale}; yrange = {a, ylo, yhi, .01*scale}; data = Table[a + I b, Evaluate[yrange], Evaluate[xrange]]; ArrayPlot[mandelComp[data, ii], ImageSize -> 300]], "MouseDown" :> (dragval = dragstart = scale*MousePosition["GraphicsScaled"]), "MouseDragged" :> (dragval = scale*MousePosition["GraphicsScaled"]), "MouseUp" :> (draghold = draghold + dragstart - dragval; dragstart = dragval = {0, 0})]}]] ] doPlotDrag[{0, 1}]
Out[3]=