본문 바로가기

프로그래밍18

Matlab ODE에 추가 파라미터 전달 및 이벤트 설정하기 일반적으로 매트랩(Matlab)에서 수치적분하고자 하는 ODE 함수의 구조는 다음과 같다. dxdt = odefun(t,x) 여기서 odefun은 함수의 이름, t 는 시간, x 는 함수의 상태변수다. 함수에서 t 를 계산에 사용하지 않더라도 t 와 x 를 모두 입력값으로 받아야 한다. 그런데 만약 t 와 x 이외에 파라미터가 더 필요하다면 어떻게 해야 할까. 예를 들면, 다음과 같은 함수가 있다. \[ \begin{align} \dot{\mathbf{x}}(t) &= \begin{bmatrix} \dot{x} \\ \dot{y} \\ \dot{v}_x \\ \dot{v}_y \end{bmatrix} = \mathbf{f}(\mathbf{x}(t)) \tag{1} \\ \\ &= \begin{bmatri.. 2023. 7. 9.
판다스(Pandas)에서 CSV파일 읽기 CSV(comma-separated values) 파일은 데이터를 쉼표로 분리된 테이블로 저장한 텍스트 파일이다. 예를 들면 다음과 같은 것이다. 이름, 회사, 직책, 생년월일 대조영, 대우상사, 과장, 1990-02-01 왕건, 미래바이오, 부장, 1981-09-17 이성계, 오성텔레콤, 대리, 2000-05-15 판다스(Pandas) 라이브러리의 read_csv() 함수를 이용하면 CSV파일을 읽어서 판다스의 데이터 구조인 DataFrame 타입으로 저장할 수 있다. read_csv() 함수의 주요 인자는 다음과 같다. import pandas as pd data = pd.read_csv(file_path, thousands=’,’, header=None) thousands는 천 단위로 쉼표로 끊어져.. 2023. 5. 18.
Simulink Constant 블록에서 Matlab 구조체를 사용하는 방법 매트랩 구조체형 배열(struc)을 사용하면 관련 데이터를 그룹화하여 동일한 변수 이름으로 관리할 수 있어서 편리하다. 예를 들면 항공기 날개에 관련된 데이터를 다음과 같이 wing이라는 이름으로 관리할 수 있다. wing.b=30; % wing span (ft) wing.S=300; % wing area (ft^2) wing.cbar=11.32;% mean aerodynamic chord (ft) 하지만 시뮬링크에서 Constant 블록의 상수값을 구조체 wing으로 설정하고 사용하면 오류가 생긴다. 예를 들면 wing을 입력으로 받아서 이중 wing.S 만을 출력시키는 간단한 시뮬링크 모델을 만들고, function a = test(wing) a = wing.S; 실행하면 다음과 같은 오류 메시지가 .. 2023. 4. 29.
Mac M1 Pro 에 Tensorflow, Gym, Mujoco 설치하기 Mac M1 Pro에 Tensorflow 를 설치하면서 애를 먹은터라 다음을 위하여 기록해 놓는다. 1. Anaconda 설치하기 (M1을 지원하기 시작함) 2. 가상환경 (이름을 tf 로 함) 만들기 conda create -n tf anaconda 3. 가상환경으로 이동 후, 텐서플로 설치 전에 pip 부터 업그레이드 pip install --upgrade pip 4. 가상환경에서 텐서플로 설치 conda install -c apple tensorflow-deps pip install tensorflow-macos pip install tensorflow-metal 4. 에러 나오면 numpy, scipy 업그레이드 (이 부분이 중요) pip install numpy –-upgrade pip inst.. 2022. 9. 19.
TensorFlow2에서 1차, 2차 편미분 계산 자동으로 미분을 계산하려면 Tensorflow는 순방향 패스 과정에서 어떤 순서로 어떤 연산을 했는지 기억해야 한다. 그런 다음, 역방향 패스 중에 이 연산 목록을 역순으로 이동해 가며 미분(derivative)을 계산한다. Tensorflow는 자동으로 미분을 계산하기 위해서 tf.GradientTape API를 제공한다. Tensorflow는 tf.GradientTape의 컨텍스트 내에서 실행 된 관련 연산을 '테이프'에 '기록'한다. 그런 다음 해당 테이프를 거꾸로 돌려서 기록된 연산의 미분을 계산한다. tf.Variable로 생성된 변수에 대해서만 미분할 수 있는데 상수인 경우에도 watch() 메쏘드를 이용하면 미분을 계산할 수 있다. 예를 들어서 \(y(x,t)=x^3+2t\) 를 \(x\) .. 2021. 7. 25.
주피터 노트북 사용법 주피터 노트북(Jupyter Notebook)을 사용하면 웹 브라우저에서 파이썬 코드를 입력하고 실행시켜 결과를 즉시 확인해 볼 수 있다. 또한 주피터 노트북은 파이썬 코드뿐만 아니라 설명 문서, 이미지, 수식 등을 하나의 파일로 기록할 수 있는 환경을 제공하여 강의 자료나 프리젠테이션 용도로도 많이 사용된다. 주피터 노트북은 아나콘다에 포함되어 있으므로 따로 설치할 필요가 없다. 실행 방법은 윈도 시작 버튼에서 아나콘다 폴더의 주피터 노트북을 클릭하거나, 또는 파이참(PyCharm)의 터미날 창에 jupyter notebook이라고 치면 된다. 그러면, 서버가 실행되며 웹 브라우저에서 노트북이 실행된다. 새로운 파이썬 노트북을 만드려면 우선 New -> Python 3 를 클릭한다. 그러면 새 노트북이.. 2021. 5. 5.
Model Subclassing 멀티 입력 신경망 모델 구현 방법 Model Subclassing API를 사용하여 입력을 여러 개 갖는 즉, 멀티 입력 신경망 모델을 어떻게 구현하고 빌드(build)할 수 있을까. 강화학습의 DDPG알고리즘에서는 행동가치 함수(actor-value function)를 크리틱(critic) 신경망으로 구현한다. 크리틱 신경망은 입력으로 상태(state)와 행동(action)등 두 개를 받는데, 이를 Model Subclassing API를 이용해서 구현해 보자. 구현해야 할 신경망 구조는 다음 그림과 같다. 상태변수를 첫번째 은닉층에서 처리한 후 두번째 은닉층에서 행동과 병합하는 구조다. from tensorflow.keras.models import Model from tensorflow.keras.layers import Input.. 2021. 3. 16.
tf.reduce_sum 함수 tf.reduce_sum 은 텐서의 모든 성분의 총합을 계산하는 함수다. 예를 들어 다음과 같은 \(2 \times 1 \times 3\) 텐서 \(A\)를 구성하는 모든 성분의 총합을 구하기 위해서 tf.reduce_sum(A) 하면 21 이 나온다. 이 때 모든 차원(dimension)은 사라진다. import tensorflow as tf A = tf.constant([[[1, 2, 3]], [[4, 5, 6]]]) print("A=", A) print(tf.reduce_sum(A)) Output: A= tf.Tensor( [[[1 2 3]] [[4 5 6]]], shape=(2, 1, 3), dtype=int32) tf.Tensor(21, shape=(), dtype=int32) 텐서 \(A\)의.. 2021. 3. 12.
넘파이(numpy)에서 행렬 연산 행렬의 덧셈과 뺄셈은 행렬의 구성 성분(element) 단위의 계산이다. 덧셈과 뺄셈에서는 기본적으로 두 행렬의 행과 열의 크기가 같아야 한다. 예를 들어 행렬 \(A\)와 \(B\)의 덧셈과 뺄셈은 다음과 같다. \[ \begin{align} & A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix}, \ \ \ B = \begin{bmatrix} 7 & 8 & 9 \\ 10 & 11 & 12 \end{bmatrix} \\ \\ & C=A+B = \begin{bmatrix} 8 & 10 & 12 \\ 14 & 16 & 18 \end{bmatrix} \\ \\ & D=A-B = \begin{bmatrix} -6 & -6 & -6 \\ -6 & -6 & -6 .. 2021. 3. 12.
넘파이(numpy)에서 행렬 모양 바꾸기, 자르기, 확장하기 먼저 \(2 \times 3\) 행렬 \(A\)를 생성해 보자. \[ A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} \] import numpy as np A = np.array([[1,2,3], [4,5,6]]) 이 행렬을 \(3 \times 2\) 로 바꾼 행렬 \(B\)를 만들려면 ndarray.reshape 라는 함수를 사용한다. \[ B = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix} \] B = A.reshape((3,2)) print("A=",A, "\nB=",B) 소괄호가 두 개가 있음에 주의해야 한다. 성분의 배치 순서는 행렬 \(A\)의 첫 행의 처음부터 시작하여 오른쪽으로 가면서.. 2021. 3. 11.