전산물리 숙제로 프랙탈을 그렸습니다. 음...ㅋㅋ 방법은 다음과 같습니다.

복소평면에서 Newton's Method를 이용해 Z^3-1=0의 해를 찾는 건데요. 임의의 점(x,y)에서 뉴턴 메서드를 사용해 해를 찾을 때 세가지 해 중 한가지 해를 찾게 됩니다. 물론 복소평면에서 말이지요. 세가지 해를 각각 R, G, B로 점을 정해놓고 복소평면의 구간의 점들에 대해 모두 해를 찾아줍니다.

그럼 프랙탈 모양이 나온다고 합니다. 물론 메스메티카나 매트랩으로 그리는 방법은 찾기가 쉬우니... 그리고 그리기도 쉽죠? ㅋㅋ(그러나 전 안그려봤음...)

전산물리 숙제이기에 C로 만들어 보았습니다.

코딩하기 전에 복소평면을 실평면에서 그릴 수 있게 허수부와 실수부를 나누는 작업도 해야 합니다. 아래에 뉴턴 메서드에 맞게 계산한 결과가 있습니다.

이제 코딩을 열라 하면 됩니다. 제가 고치고 고쳐서 만든 프로그램은 다음과 같습니다.

./fractal.out x1 y1 x2 y2

이렇게 순서대로 인수를 입력합니다. 그럼 (x1, y1)에서부터 (x2, y2)까지의 범위에서 적절한 해상도로 점을 찍어가며 계산합니다. 이렇게 입력하고 난 뒤에는 di, 즉 해상도가 나옵니다. 

그리고 데이터파일 3개에 각각의 근에 해당하는 좌표들을 저장합니다.

여기서 문제가 생기는데.... 허수부가 0이고 실수가 1인 해의 처리입니다. 해를 코드에서 판별할 때 허수부가 0인지 0보다 큰지 또는 작은지로 판단하는데 1의 근에서 허수부가 정확한 0이 아니라 0.00000000001 이런 값을 가질 수도 있더군요.. 컴퓨터로 계산하다보니 그런 것 같습니다... 그래서 작은 범위를 주어 0 근처의 값을 가지면 무조건 0으로 분기시킵니다.

이외에는 코드를 차근차근 보면 이해하기 쉽습니다. 그림은 Gnuplot으로 그렸습니다.

코드를 보시려면 아래를 눌러주세요.


프로그램을 만들고 돌려서 점을 찍으면... 두둥!! (데이터 파일 용량이... 메가 단위네요.. 쩔ㅋㅋ)


규칙적으로 점을 찍어서 plot해보니 하얀 줄무늬가 나오더라구요.. 에이...ㅋㅋ
구글에서 찾아보니 이런 그림을 Basins of attraction이라고 하더군요. 이게 무엇인지는 나중에 공부하게 되면 올려야지....

+ Recent posts