본문 바로가기
  • On the ball
Data/TensorFlow

편미분 방정식으로 물결 파동 표현하기

by pub-lican-ai 2017. 3. 21.
반응형

편미분 방정식으로 물결 파동 표현하기


#편미분방정식 여러개의 변수 중 몇 개의 변수만을 미분하는 부분 도함수 연산

N=500

u_init = np.zeros([N,N], dtype=np.float32)

ut_init = np.zeros([N,N], dtype=np.float32)  #시간에 따른 변화 최종상태 저장


for n in range(40):

    a,b= np.random.randint(0,N,2)   #0과 2사이의 임의의 2차원 정수 배열 반환

    u_init[a,b]=np.random.uniform()  


def laplace(x):

    laplace_k=make_kernel([[0.5,1.0,0.5],[1.0,-6.,1.0],[0.5,1.0,0.5]])

    return simple_conv(x, laplace_k)

def make_kernel(a):

    a=np.asarray(a)

    a=a.reshape(list(a.shape)+[1,1])

    return tf.constant(a,dtype=1)

def simple_conv(x,k):  #라플라스 변환 / 컨볼루션(합성곱)으로 정의  이미지의 특정 픽셀에 커널 행렬을 곱하는 형태로 파동 표현

    x=tf.expand_dims(tf.expand_dims(x,0),-1)

    y=tf.nn.depthwise_conv2d(x,k,[1,1,1,1],padding='SAME')

    return y[0,:,:,0]


eps= tf.placeholder(tf.float32,shape=())    #시물레이션 스텝마다 적용되는 모델 학습 매개변수

damping=tf.placeholder(tf.float32,shape=()) #모델에서 사용하는 damping 계수


#변수 재정의

U=tf.Variable(u_init)

Ut=tf.Variable(ut_init)


# 편미분 함수 정의 

U_= U+eps*Ut

Ut_=Ut+eps*(laplace(U)-damping*Ut)


sess = tf.InteractiveSession()

step= tf.group(U.assign(U_),Ut.assign(Ut_))  #그룹명령어를 통해 시간t에 연관된 수식을 하나의 스텝으로 묶음

tf.global_variables_initializer().run()   #변수초기화


for i in range(1000):     #1000스텝 진행 

    step.run({eps:0.1, damping:0.1})  #스텝별 시간은 0.03초, damping계수는 0.04

    if i% 50 ==0:

        #clear_output()

        plt.imshow(U.eval())

        plt.show()

출처: 책 텐서플로 입문 _ 잔카를로 자코네

반응형