어쩌다가 우연히 이 함수를 알게 되었는데, 그냥 개인 취향으로 맘에 들어서 언젠간 한 번 그려보고 싶었던 놈이였습니다. 오늘 새벽에 멍 때리다가 갑자기 생각나서 python numpy를 활용해서 그려봤네요. 거의 수학 공식 그대로를 코드로 바로 옮겨서 쓸 수 있다는 게 맘에 들었습니다. 실제로 이걸 C/C++, Java로 계산하자면(까마득...) 확실히 python이 편하긴 하네요.
코드는 다음과 같습니다.
import numpy as np import matplotlib.pyplot as plt a = 0.5 # 0 < a < 1 b = 5 # ab > 1 + 3/2 * pi x = np.arange(-5, 5, 0.0001) y = np.zeros(2 * 5 * 10000, dtype="float128") for n in xrange(1000): y += np.power(a, n) * np.cos(np.power(b ,n) * np.pi * x) if n % 100 == 0: print "Now: ", n plt.grid(True) plt.xlim(-5, 5) plt.ylim(-3, 3) plt.plot(x, y, "black", linewidth=0.1) # linewidth 조정 가능 plt.savefig("Weierstrass Function.png", dpi=1200) # 그냥 보시려면 plt.show()
이미지로 그려봤습니다. 나름 적절히 linewidth 타협을 봐서 세세하게 잘 보이면서 너무 얇지도 않게(?) 그렸습니다. 너무 얇다고 생각하시는 분은 linewidth를 0.1보다 크게 세팅하시면 됩니다.
* 그리다보면 warning으로 overflow가 뜰 수 있습니다. np.power의 특성 덕분인지는 모르겠으나 그래프 그리는데에는 큰 지장은 주지 않아서 그대로 사용했습니다. 원래는 a 초기값에서 step마다 a 자신을 초기값과 곱해서 늘려가게 짜보았으나 이건 overflow가 나버리면 아예 작동에 심각한 지장을 줘서 일단은 np.power로 했습니다. 따로 제대로된 해결책을 찾아봐야 할 것 같습니다.
'Programming > 기타' 카테고리의 다른 글
[Python] 소설 '개미'(Les Fourmis)에 나온 수열 구하기 (0) | 2016.11.17 |
---|---|
[Python] Weierstrass Function 그려보기! (0) | 2016.11.09 |