편미분 방정식으로 물결 파동 표현하기
#편미분방정식 여러개의 변수 중 몇 개의 변수만을 미분하는 부분 도함수 연산
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()
출처: 책 텐서플로 입문 _ 잔카를로 자코네
'Data > TensorFlow' 카테고리의 다른 글
MNIST 데이터 집합 읽어오기, 이미지로 나타내기 (1) | 2017.04.14 |
---|---|
선형 회귀 알고리즘 구현, 비용함수, 경사하강법 (0) | 2017.04.14 |
미분계수구하기, 난수 발생 (0) | 2017.03.16 |
Image 읽고 특정 영역자르기 / 회전 (0) | 2017.03.15 |
기본 자료구조 Tensor, 산술연산 명령어 (0) | 2017.03.14 |