JModelica로 상미분 방정식의 초기값 문제를 풀다

11063 단어 ModelicaPython1DCAE

목적

  • 유행하는 1DCAM
  • 을 사용하고 싶습니다.
  • JModelica의interface 사용 편의성을 확인하고 싶다
  • Modelica 언어 학습
  • OpenModelica라고 불리기 전에 JModelica의 좋은 곳을 찾고 싶다
  • 또한 환경 구축 방법은 Ubuntu에 JModelica 설치의 글을 참조했다.

    JModelica의 기본 사용 방법

  • Model 파일 준비(*.mo)
  • Function Mockup Units(이하 FMUs)로 컴파일
  • 읽기 FMUs
  • 컴퓨팅 읽기 FMUs
  • 관찰 결과
  • 물론 컴파일된 FMUs는 3개 절차에서 읽을 수도 있습니다.

    상미분 방정식을 풀다


    구글 선생님의 말에 따르면 모델리카에서 Hello World를 언급하면 1층 선형 상미분 방정식의 초기값 문제가 비교적 많다고 한다.
    \begin{eqnarray}
    \frac{dx(t)}{dt} &=& -x(t) \\
      x(0) & = & 1
    \end{eqnarray}
    
    종이와 연필로 푸는 방법은 교과서에 맡기고, 해석해 도출은 SymPy로 한다.다음 작업은 SymPy를 사용할 수 있는 환경에서 수행됩니다.
    python
    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}
    

    JModelica로 상미분 방정식을 풀다


    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
    
    ipython
    from 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 정보

  • JModelica의 적분기를 담당하는 파이톤의 모듈(JModelica가 사용할 수 있는 환경이라면 사용)
  • 상미분 방정식을 쉽게 풀 수 있다
  • Anaconda의 사람conda install -c https://conda.binstar.org/chria assimulo 설치
  • ipython
    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()
    

    총결산

  • SymPy를 이용하여 1층 선형 상미분 방정식 초기값 문제의 해석을 도출
  • JModelica의 기본 사용 방법 확인
  • 계산 결과(수치 해석)의 외관은 해석에 비해 양호하다
  • 계산 결과는 파이톤으로 처리할 수 있기 때문에 편리하다
  • Assimulo로 상미분 방정식에 대해 수치 구해를 진행하였다
  • 상미분 방정식을 세우면 편리하다
  • Assimulo의 독법이 불분명하다
  • 좋은 웹페이지 즐겨찾기