"나는 매개변수 네 개만 있으면 코끼리를 만들 수 있다. 다섯 개 있으면 코를 움직일 수도 있다."


  폰 노이만이 했던 말인데, 어떤 수학적 모형을 만들 때 너무 복잡하게 만들지 말라는 뜻이다. 아르키메데스가 충분한 길이의 지렛대와 공간만 있으면 지구를 움직일 수 있다고 말했던 것처럼 실제로 하겠다는 말이 아니라 상징적인 의미이다.

  그런데 미국 물리교사협회에 발표된 논문에 따르면 유럽의 과학자들이 실제로 다섯 개의 매개변수로 코끼리를 만들고 코를 움직이는데 성공했다.(https://fermatslibrary.com/s/drawing-an-elephant-with-four-complex-parameters) 아래는 논문과 다른 레퍼런스들을 참고해 만든 코드이다.


import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation



p1 = 50 - 30j
p2 = 18 + 8j
p3 = 12 - 10j
p4 = -14 - 60j
p5 = 40 + 20j

Ax = np.array([0, 0, 0, p3.real, 0, p4.real])
Bx = np.array([0, p1.real, p2.real, 0, 0, 0])
Ay = np.array([0, p4.imag, 0, 0, 0, 0])
By = np.array([0, p1.imag, p2.imag, p3.imag, 0, 0])

a = 1.426
b = 2.89
t1 = np.arange(b, a*np.pi + 0.01, 0.01)
t2 = np.arange(a*np.pi, 2*np.pi + b, 0.01)


def series(t, C1, C2):
    f = np.zeros(np.shape(t))

    for n in range(len(C1)):
        f += C1[n]*np.cos(n*t) + C2[n]*np.sin(n*t)

    return f


X1 = series(t1, Ax, Bx)
Y1 = series(t1, Ay, By)
X2 = series(t2, Ax, Bx)
Y2 = series(t2, Ay, By)

x1 = Y1
y1 = -X1
x2 = Y2
y2 = -X2

fig = plt.figure()
trunk = plt.plot(x1, y1)[0]
body = plt.plot(x2, y2, 'C0')[0]
eye = plt.scatter([p5.imag], [p5.imag], marker='x')


def upd_trunk(t):        
    trunk.set_ydata(y1 + 10*np.sin((x1 - p5.real)/len(y1))*np.sin(t))
   

ani = animation.FuncAnimation(fig, upd_trunk, np.arange(50), interval=40)
plt.show()


그리고 결과는 다음과 같다.

                         



  코드의 p1, p2 p3, p4, p5가 바로 폰 노이만이 말했던 코끼리를 만드는데 필요한 매개변수이다. p1, p2, p3, p4는 코끼리의 x성분과 y성분의 푸리에 급수의 계수가 되어 코끼리를 구성한다. 그리고 p5의 허수부는 눈의 좌표가 되고, 실수부는 코와 몸통이 연결되는 부분의 x값을 지정해 코의 움직임을 어색하지 않게 만들어준다. 자세히 설명하자면 upd_trunk라는 함수가 코를 움직이는 함수인데, 함수의 sin(x1 - p5.real)라는 부분이 x값이 p5의 실수부가 되는 지점의 변위를 0으로 만들어 코와 몸통이 붙어있게 만든다. 이 부분이 없다면 코가 몸통과 떨어져 움직인다.

  눈치챘듯이 논문에서 제시된 매개변수는 전부 복소수이다. 복소수 고유의 성질을 사용했다면 모를까 실수부와 허수부를 분리해서 따로따로 사용한 걸 보면 복소수를 사용한 이유는 두 개의 매개변수를 하나에 담기 위해서인 것 같다. 따라서 실질적으로 10개의 매개변수를 사용한 것과 다를 바 없다. 


레퍼런스

https://fermatslibrary.com/s/drawing-an-elephant-with-four-complex-parameters

https://www.johndcook.com/blog/2011/06/21/how-to-fit-an-elephant/

https://www.youtube.com/watch?v=CVDYh5liQkA

https://github.com/QuantLet/FittingElephant