[Python에 의한 과학·기술 계산] 2층 상미분 방정식의 수치 해법, 초기값 문제, 수치 계산
소개
numpy, sympy, scipy를 이용하여,
2층 상미분 방정식을 초기 조건 하에서 풀린다.
내용
문제(단 진동): ($k=1$는 파라미터)
$x''(t)+kx(t)=0$, 초기 조건 $x(0)=0, x'(0)=1$
1층 상미분 방정식 문제에서는 초기 조건을 수치로 주었지만, 2층 이상의 상미분 방정식의 해법에서는 초기 조건을 리스트로 주는 것에 주의한다.
코드
from sympy import * # sympyライブラリから全ての機能をimoprt
import numpy as np # numpyをnpという名前でimport
from scipy.integrate import odeint
import matplotlib.pyplot as plt
"""
2階微分方程式
例題 (単振動): d^2x/dt^2 = -kxを x(0)=0,x'(0)=1の初期条件の下で解く
"""
#シンボル定義
x=Symbol('x') # 文字'x'を変数xとして定義
t=Symbol('t') # 文字 't'を変数tとして定義
k=Symbol('k') # 文字 'k'を変数kとして定義。本問ではパラメータとして使う。
#
def func2(x, t, k):
x1,x2=x
dxdt=[x2,-k*x1]
return dxdt
k = 1.0 # パラメータ設定
x0 = [0.0,1.0] # 初期条件: それぞれx(0), x'(0)を表す
t=np.linspace(0,10,101) # 積分の時間刻み設定: 0から10までを101等分する
sol2=odeint(func2, x0, t, args=(k,)) # 数値的に微分方程式を解き, x(t)とx'(t)をsol2のリストの[:,0]および[:,1]成分へ格納する。
#可視化
plt.plot(t, sol2[:,0], linewidth=1,label='x(t)') # x(t) を図示
plt.plot(t, sol2[:,1], linewidth=1,label='dx(t)/dt') # dx/dt を図示
plt.xlabel('t', fontsize=18)
plt.ylabel('x', fontsize=18,rotation='horizontal')
plt.legend(loc='upper right')
plt.show()
결과
Reference
이 문제에 관하여([Python에 의한 과학·기술 계산] 2층 상미분 방정식의 수치 해법, 초기값 문제, 수치 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sci_Haru/items/7cad18ef3f73ec1e2eab
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
문제(단 진동): ($k=1$는 파라미터)
$x''(t)+kx(t)=0$, 초기 조건 $x(0)=0, x'(0)=1$
1층 상미분 방정식 문제에서는 초기 조건을 수치로 주었지만, 2층 이상의 상미분 방정식의 해법에서는 초기 조건을 리스트로 주는 것에 주의한다.
코드
from sympy import * # sympyライブラリから全ての機能をimoprt
import numpy as np # numpyをnpという名前でimport
from scipy.integrate import odeint
import matplotlib.pyplot as plt
"""
2階微分方程式
例題 (単振動): d^2x/dt^2 = -kxを x(0)=0,x'(0)=1の初期条件の下で解く
"""
#シンボル定義
x=Symbol('x') # 文字'x'を変数xとして定義
t=Symbol('t') # 文字 't'を変数tとして定義
k=Symbol('k') # 文字 'k'を変数kとして定義。本問ではパラメータとして使う。
#
def func2(x, t, k):
x1,x2=x
dxdt=[x2,-k*x1]
return dxdt
k = 1.0 # パラメータ設定
x0 = [0.0,1.0] # 初期条件: それぞれx(0), x'(0)を表す
t=np.linspace(0,10,101) # 積分の時間刻み設定: 0から10までを101等分する
sol2=odeint(func2, x0, t, args=(k,)) # 数値的に微分方程式を解き, x(t)とx'(t)をsol2のリストの[:,0]および[:,1]成分へ格納する。
#可視化
plt.plot(t, sol2[:,0], linewidth=1,label='x(t)') # x(t) を図示
plt.plot(t, sol2[:,1], linewidth=1,label='dx(t)/dt') # dx/dt を図示
plt.xlabel('t', fontsize=18)
plt.ylabel('x', fontsize=18,rotation='horizontal')
plt.legend(loc='upper right')
plt.show()
결과
Reference
이 문제에 관하여([Python에 의한 과학·기술 계산] 2층 상미분 방정식의 수치 해법, 초기값 문제, 수치 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sci_Haru/items/7cad18ef3f73ec1e2eab
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
from sympy import * # sympyライブラリから全ての機能をimoprt
import numpy as np # numpyをnpという名前でimport
from scipy.integrate import odeint
import matplotlib.pyplot as plt
"""
2階微分方程式
例題 (単振動): d^2x/dt^2 = -kxを x(0)=0,x'(0)=1の初期条件の下で解く
"""
#シンボル定義
x=Symbol('x') # 文字'x'を変数xとして定義
t=Symbol('t') # 文字 't'を変数tとして定義
k=Symbol('k') # 文字 'k'を変数kとして定義。本問ではパラメータとして使う。
#
def func2(x, t, k):
x1,x2=x
dxdt=[x2,-k*x1]
return dxdt
k = 1.0 # パラメータ設定
x0 = [0.0,1.0] # 初期条件: それぞれx(0), x'(0)を表す
t=np.linspace(0,10,101) # 積分の時間刻み設定: 0から10までを101等分する
sol2=odeint(func2, x0, t, args=(k,)) # 数値的に微分方程式を解き, x(t)とx'(t)をsol2のリストの[:,0]および[:,1]成分へ格納する。
#可視化
plt.plot(t, sol2[:,0], linewidth=1,label='x(t)') # x(t) を図示
plt.plot(t, sol2[:,1], linewidth=1,label='dx(t)/dt') # dx/dt を図示
plt.xlabel('t', fontsize=18)
plt.ylabel('x', fontsize=18,rotation='horizontal')
plt.legend(loc='upper right')
plt.show()
Reference
이 문제에 관하여([Python에 의한 과학·기술 계산] 2층 상미분 방정식의 수치 해법, 초기값 문제, 수치 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sci_Haru/items/7cad18ef3f73ec1e2eab텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)