JModelica로 상미분 방정식의 초기값 문제를 풀다
목적
JModelica의 기본 사용 방법
상미분 방정식을 풀다
구글 선생님의 말에 따르면 모델리카에서 Hello World를 언급하면 1층 선형 상미분 방정식의 초기값 문제가 비교적 많다고 한다.\begin{eqnarray}
\frac{dx(t)}{dt} &=& -x(t) \\
x(0) & = & 1
\end{eqnarray}
종이와 연필로 푸는 방법은 교과서에 맡기고, 해석해 도출은 SymPy로 한다.다음 작업은 SymPy를 사용할 수 있는 환경에서 수행됩니다.
pythonimport sympy
x = sympy.Function("x"); t,C1 = sympy.symbols("t C1")
#x(t)について解く x(t) == C1*exp(-t)
ans = sympy.dsolve(x(t).diff(t)+x(t),x(t))
#積分定数C1を計算(t=0,x(0)=1)し、ansの式に代入する
C = {C1:ans.subs(x(t),1).subs(t,0).lhs}
ans.subs(C)
#--> x(t) == exp(-t)
이상의 분석은 다음과 같다.\begin{eqnarray}
x(t) & = & \exp(-t)
\end{eqnarray}
JModelica로 상미분 방정식을 풀다
1. 모델 파일 준비
다음 모델 파일 준비
ode_test.momodel HelloWorld
Real x(start=1);
equation
der(x)= -x;
end HelloWorld;
1행~5행: 모델(클래스) 정의
두 번째 줄: 초기값 1의 상태 변수 x의 정의
세 번째 줄: 다음은 각 변수의 관계식을 정의한다.의 신호
4행: dx/dt=-x의 방정식 정의
2. 모델을 FMUs로 컴파일하기
모델 파일 디렉토리에서 JModelica를 시작합니다.(설치 장소가 적절하게 변경됨)
bash/home/ubuntu/JModelica/bin/jm_ipython.sh
ipythonfrom pymodelica import compile_fmu
hello_fmu = compile_fmu("HelloWorld","./ode_test.mo")
3. FMUs 읽기
ipythonfrom pyfmi import load_fmu
hello_model = load_fmu(hello_fmu)
4. 읽은 FMUs 계산
1초의 양을 계산하다
ipythonres = hello_model.simulate(final_time=1)
5. 결과 보기
상태 변수 x의 결과는 res["x"]
를 통해 접근할 수 있습니다.
앞의 해석을 도표로 합치다.
ipythonimport numpy as np
from matplotlib import pyplot as plt
t = np.linspace(0,1,101)
x = np.exp(-t)
plt.plot(t, x, label="$x=e^(-t)$")
plt.plot(res["time"],res["x"],"--",label="JModelica")
plt.legend()
plt.show()
Assimulo로 상미분 방정식을 풀다
Assimulo 정보
\begin{eqnarray}
\frac{dx(t)}{dt} &=& -x(t) \\
x(0) & = & 1
\end{eqnarray}
import sympy
x = sympy.Function("x"); t,C1 = sympy.symbols("t C1")
#x(t)について解く x(t) == C1*exp(-t)
ans = sympy.dsolve(x(t).diff(t)+x(t),x(t))
#積分定数C1を計算(t=0,x(0)=1)し、ansの式に代入する
C = {C1:ans.subs(x(t),1).subs(t,0).lhs}
ans.subs(C)
#--> x(t) == exp(-t)
\begin{eqnarray}
x(t) & = & \exp(-t)
\end{eqnarray}
1. 모델 파일 준비
다음 모델 파일 준비
ode_test.mo
model HelloWorld
Real x(start=1);
equation
der(x)= -x;
end HelloWorld;
1행~5행: 모델(클래스) 정의두 번째 줄: 초기값 1의 상태 변수 x의 정의
세 번째 줄: 다음은 각 변수의 관계식을 정의한다.의 신호
4행: dx/dt=-x의 방정식 정의
2. 모델을 FMUs로 컴파일하기
모델 파일 디렉토리에서 JModelica를 시작합니다.(설치 장소가 적절하게 변경됨)
bash
/home/ubuntu/JModelica/bin/jm_ipython.sh
ipythonfrom pymodelica import compile_fmu
hello_fmu = compile_fmu("HelloWorld","./ode_test.mo")
3. FMUs 읽기
ipython
from pyfmi import load_fmu
hello_model = load_fmu(hello_fmu)
4. 읽은 FMUs 계산
1초의 양을 계산하다
ipython
res = hello_model.simulate(final_time=1)
5. 결과 보기
상태 변수 x의 결과는
res["x"]
를 통해 접근할 수 있습니다.앞의 해석을 도표로 합치다.
ipython
import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(0,1,101)
x = np.exp(-t)
plt.plot(t, x, label="$x=e^(-t)$")
plt.plot(res["time"],res["x"],"--",label="JModelica")
plt.legend()
plt.show()
Assimulo로 상미분 방정식을 풀다
Assimulo 정보
conda install -c https://conda.binstar.org/chria assimulo
설치from assimulo.solvers import CVode
from assimulo.problem import Explicit_Problem
#微分方程式を表す関数を定義
def ode_func(t,x):
dxdt = -x[0]
return np.array([dxdt])
#陽的な問題と積分器を含んだモデルを定義し計算
exp_mod = Explicit_Problem(ode_func, 1) #xの初期値は1
exp_sim = CVode(exp_mod)
t1, x1 = exp_sim.simulate(1)#計算時間1秒
#結果のプロット
plt.plot(t, x, label="$x=\exp(-t)$")#先に計算した解析解
plt.plot(res["time"],res["x"],'--',label="JModelica")#JModelicaの数値解
plt.plot(t1,x1,'-.',label="assimulo")#Assimuloの数値解
plt.legend()
plt.show()
총결산
Reference
이 문제에 관하여(JModelica로 상미분 방정식의 초기값 문제를 풀다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/TatsuyaKatayama/items/a660535fc31d784d70a4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)