만델브로트 집합은 이주 간단한 복소수 점화식 (정확히 표현하면 이나 프로그래밍 편의상 간단히 로 표현하는 것으로 한다)에서 출발한다. 에서 의 초기값을 로 하여 점화식을 계속 반복하여 계산한다. 그 결과 는 값에 따라 하나의 값으로 수렴하기도 하고, 여러 값 사이를 순환적으로 왔다 갔다 하기도 하고 카오스적인 값이 반복되기도 한다. 만델브로트 집합에서도 기본 알고리즘은 마찬가지다. 연산식은 이다. 의 초기값을 로 하여 점화식을 반 복하여 계산한다. 그 결과는 값에 의존한다. 즉 값에 따라 가 하나의 값으로 수렴하 기도 하고 여러 값 사이를 순환적으로 맴돌기도 하고 아주 큰 값으로 발산하기도 한다. 만 델브로트 집합은 초기값을 로 했을 때 을 발산시키지 않는 복소수 들의 모임이다. 파이겐바움 분기도 에서 의 초기값을 0.2로 하고 점화식을 반복할 때, 는 의 값에 따라 수렴하기도 하고, 여러 값 사이를 순환적으로 움직이기도 하고 카 오스적인 값이 반복되기도 한다. 만델브로트 집합에서 마찬가지로 =0+0 로 점화식을 계속 반복하여 계산한다. 결과는 값에 의존한다. 값에 따라 가 하나의 값으로 수렴하기도 하고 여러 값 사이를 순 환적으로 맴돌기도 하고 큰 값으로 발산하기도 한다. 의 초기값을 =0+0 으로 하였 을 때, 을 발산시키지 않는 복소수 들의 모임이다., 일 일 때 의 연산 후 의 실수부와 허수부 가 어떻게 되는지 알아보자. 라 하면 이므로 따라서 1 c=0.36 +0.4 (발산하므로 만델브로트 집합이 아니다.) 왼쪽 그림은 1행을 축으로 2행을 축으로 그렸고, 3행은 실수부와 허수부를 제곱하
여 원점으로부터 멀어지는 정도를 그린 것이다. 2 c=0.36 + 0.37 (발산하므로 만델브로트 집합이 아니다) 아래 그림은 셀에 입력되어 있는 내용이다. 3 c=0.33 + 0.33 (수렴하므로 만델브로트 집합이다.) 4 c=0.34+0.34 (수렴하므로 만델브로트 집합이다.)
5 c=0.37 + 0.32 (만델브로트 집합의 경계선에 있다.) 6 c=0.35 + 0.35 (만델브로트 집합의 경계선에 있다.)
1 오른쪽 그림은 왼쪽 일부를 확대한 그림이다. 2 범위지정 및 수식 View 메뉴의 Edit Equation을 이용하여 수식 및 범위를 변경할 수 있다. 3 오른쪽 끝 아이콘은 정지 명령이다. 오른쪽 끝에서 두 번째는 일시 정시이다. 삼각형은 실행이다.
1 Draw에서 mini draw로 그린 것이다. 아래의 점선을 확대한 것이 오른쪽 그림이다. 전체 화면에 매우 빠르게 그린다. 범위를 지정할 수 있다. 1 이 프로그램은 카오스를 이해할 수 있는 많은 종류의 내용이 있다. 왼쪽그림을 저장한 후 [File]에서 3D Restore를 실행한 화면이다. Fractals에서 Fractal Formula에서 프랙탈과 카오스를 맘껏 경험할 수 있다. 만델브로트 집합을 누르면 줄리아 집합이 나온다. 만델브로트을 살펴보자. 까지 조사한다. 양식상의
0-mx(x의 길의)에는 실수부 에서 를 대응시키고, 0-my(y의 길이)에는 허수부 에서 를 대응시킨다. 이와 같이 하면 양식상의 (j열, i행)의 위치에 대한 복소수 의 는 다음과 같이 계 산된다. 에 대한 좌표= 의 축상의 길이 * 평면상의 길이 + = 에 대한 좌표= 의 축상의 길이 * 평면상의 길이 + = 에서 mx 까지, j=1 에서my 열까지 증가되면서 의 과 를 계산한 후, 가 를 발산시키는 가를 조산한다. 발산하지 않으면 (j열, i행)의 좌표에 점 을 찍고 화면상에서 만델브로트 집합에 해당하는 그림을 그린다. 는 컴파일이 되는 c++이나, 비주얼 베이직 같은 경우는 반복을 100번이상 해 도 속도의 저하가 그리 크기 않으나, 엑셀은 컴파일이 되지 않으므로 20-30 번정도의 반 복을 시행한다. 반복 계산 중 가 발산하면 ( )가 원점에서 부터 멀리 떨어진 곳으로 이동하게 되고, 따라서 이때에는 의 절대값( )큰 값이 된다. 의 절대값이 100 이 넘으면 발산한 것으로 처리한다. 집합에 속하는 는 -2-2i에서 2+2i이므로 발산 여부 는 를 조사하는 것으로 충분하다.
발산 속도에 따라 다른 색 으로 점을 찍는 방법이다. (LSM : Level Set Method) 발산 속도가 느리면 흰색으로 점을 찍고, 만델브로 집합에 속하면 검은색으로 점을 찍는 다.
가운 데 검은 색으로 채색된 부분이 만델브로트 집합이고, 주위의 흰 부분은 만델브로트 집합에 근접한 값들이다. 등고선상에서 같은 색으로 되어 있는 점들은 발산 속도가 같은 값 들이다. 발산속도가 같은 값들은 등고선에서 연속적임을 알 수 있다.
를 0에서 chd/2 회 계속 계산하던 도중 발산하였으면, 즉 쉽게 발산하였으면 발산 시점의 의 y>0일 때만 LSM법으로 점을 찍고 y 0 일 때는 검은 점을 찍 는 방법이 BDM(Binary Decomposition Method)이다. 마우스로 영역을 선택한 후 확대하여 볼 수 있다.
j j+1 하나 위행 b(j) b(j+1) 현재행 a(j)
현재점 a(j+1) 화면상의 j 열 위치에 해당하는 c값이 만델브로트 집합에 속하면 a(j)에 1을, 속하지 않으면 0 을 수록한다. b(j)에는 하나 위 행의 j 열에 대한 값이 수록되어 있다. j열에 대한 조사를 모두 끝낸 후에는 현재 점과 다른 세 점의 값을 비교하여 네 값이 모두 같지는 않을 때에만 점을 찍는 것이다. 만델브로트 집합은 네 값이 모두 0이므로 점이 찍히지 않고, 발산 영역 은 네 값이 모두 1이므로 점이 찍히지 않는다. 경계선은 네 값이 모두 같지 않으므로 점이 찍힌다. 왼쪽 사각형 부분의 확대가 오른쪽 그림이다.
엑셀에서도 다른 언어처럼 정교하게 그릴 수는 있지만, 시간과 메모리를 고려할 때 자세 하게 그리기는 어려움이 있다. 여기에서 사용하는 방법은 셀에 칠을 하는 것이다. 네모친 부분들을 확대한 것이 다음 그림이다. 마우스로 영역을 정하면 그곳을 확대하여 그 릴 수 있다.
(4) 발산의 정도에 따라 3차원으로 그리기 c=-1.6-1.1 에서 0.9 +1.1
(5) 의 만델브로트 집합 c=, 일 때 를 발산시키지 않는 c 들의 집합이 의 만델브로트 집합에 해당한다. c=, 일 때 따라서
Option Explicit Dim i, j, mx, my, k, saek, chd As Integer Dim a1, b1, a2, b2, c1, c2, x, y, x1, y1, x2, y2 As Double Sub mlsm() Cells.Interior.ColorIndex = 2 'ActiveSheet.Shapes.Delete Range("a1").Select '커스를 mx = 250 '가로행 전체 my = 200 '세로행 전체 a1 = Range("b13") b1 = Range("v13") a2 = Range("ap13") b2 = Range("bj13") chd = 30 For i = 1 To my For j = 1 To mx
c1 = (a2 - a1) * j / mx + a1 c2 = (b2 - b1) * i / my + b1 x = 0: y = 0 For k = 1 To chd - 1 x2 = c1 * (x * x - y * y) - c2 * 2 * x * y + c1 y2 = c2 * (x * x - y * y) + c1 * 2 * x * y + c2 x = x2 y = y2 If x * x + y * y > 10000 Then Exit For End If Next k If k = chd Then saek = 1 ElseIf k >= chd / 2 Then saek = 2 Else saek = (k + 30) Mod 53 End If ActiveSheet.Cells(i, j).interior.colorindex = saek Next j Next i End Range("b2").Interior.ColorIndex = xlnone Range("v2").Interior.ColorIndex = xlnone Range("ap2").Interior.ColorIndex = xlnone Range("bj2").Interior.ColorIndex = xlnone Range("b13").Interior.ColorIndex = xlnone Range("v13").Interior.ColorIndex = xlnone Range("ap13").Interior.ColorIndex = xlnone Range("bj13").Interior.ColorIndex = xlnone
End Sub Sub currlsm() Dim c, r, xu, yu, yd, xd, xy, odx, ody, m, areacount As Integer Dim aa1, aa2, bb1, bb2 As Double mx = 250 '가로행 전체 my = 200 '세로행 전체 xu = Selection.Columns.Count '선택열의 수 yu = Selection.Rows.Count '선택행의 수 If xu > 2 Then '셀을 하나이상 선택한 경우 a1 = Range("b13") b1 = Range("v13") a2 = Range("ap13") b2 = Range("bj13") Dim myrange As Range Dim mytotal As Range Set myrange = ActiveCell.CurrentRegion Set mytotal = myrange.offset(myrange.rows.count).rows(0) mytotal.cells(1) = myrange.columns(1).address(false, False) m = mytotal.cells(1) areacount = Selection.Areas.Count Range("a1").Select '선택영역을 지움 Cells.Interior.ColorIndex = 2 c = """col""" r = """row""" Cells(24, 1).Value = "=cell( " & c & "," & m & ")" Cells(25, 1).Value = "=cell( " & r & "," & m & ")" Cells(Cells(24, 1).Value, Cells(25, 1).Value).Value = "" xd = Cells(24, 1).Value '원점에서 거리 yd = Cells(25, 1).Value '원점에서 거리
xu = xu + xd yu = yu + yd aa1 = a1 + (a2 - a1) * xd / mx aa2 = a1 + (a2 - a1) * xu / mx bb1 = b1 + (b2 - b1) * yd / my bb2 = b1 + (b2 - b1) * yu / my a1 = aa1: b1 = bb1 a2 = aa2: b2 = bb2 Range("b13") = a1 Range("v13") = b1 Range("ap13") = a2 Range("bj13") = b2 mlsm Else '셀을 하나 이상 선택한 경우 mlsm End If End Sub Sub lsm2default() Range("b13") = -2.3 Range("v13") = -1 Range("ap13") = 1.1 Range("bj13") = 1.1 End Sub (6) 의 만델브로트 집합
주요부분