SymPy 사용법¶
sympy 라이브러리를 불러오고, 사용할 기호 변수를 선언한다. 출력을 LaTex 수식으로 나타내고, 맷플롯립 모듈을 불러온다.
from sympy import *
x, y, z, t = symbols('x y z t')
f, g, h = symbols('f, g, h', cls=Function)
init_printing()
%matplotlib inline
상미분 방정식¶
미분 방정식의 해 구하기 $$y'(t) = -2y , \qquad y(0)=0.5$$
y 를 t의 함수 y(t) 로 사용하려면, 함수로 선언하여야 한다.
y = symbols('y', cls=Function)
y(t)
deq = Eq( y(t).diff(t), -2*y(t) )
deq
미분방정식을 dsolve() 함수로 풀면 일반해가 얻어진다.
dsolve( deq, y(t) )
초기조건을 ics= {...} 으로 전달하면, 초기조건이 적용된 특수해(particular solution)를 얻는다.
psol = dsolve( deq, ics= {y(0):0.5} )
psol
윗 식의 오른쪽 부분인 .rhs 가 해이며, 이를 그래프로 그린다.
plot( psol.rhs, (t,0,2))
<sympy.plotting.plot.Plot at 0x24cee24ba90>
[예제] 비제차 미분방정식
$$y' + y \tan x = \sin 2x , \qquad y(0)= 1$$y 를 x의 함수 y(x) 로 선언하고, 미분 방정식을 기술한다.
y(x)
deq = Eq( y(x).diff(x) + y(x)*tan(x), sin(2*x) )
deq
dsolve() 함수로 일반해를 얻는다.
dsolve( deq, y(x) )
초기조건을 ics= {...} 로 설정하면, 초기조건이 적용된 특정해를 얻는다.
psol = dsolve( deq, ics= {y(0):1} )
psol
전개하여 보기 좋게 만든다.
expand( psol.rhs )
2계 미분방정식¶
$$ 10 y'' + 10 y' + 90 y = 0 , \qquad y(0)= 0.16, \quad y'(0)=0 $$
함수 y(t) 를 선언하고, 미분 방정식을 기술한다.
y(t)
deq = Eq( 10*y(t).diff(t,2) + 10*y(t).diff(t) + 90*y(t), 0 )
deq
dsolve() 함수의 인자에 초기조건을 ics= {...} 로 전달하여, 초기조건이 적용된 특정해를 얻는다.
sol = dsolve( deq, ics= { y(0):0.16, y(t).diff(t).subs(t,0):0 } )
sol
plot( sol.rhs, xlim=(0,8), ylim=(-0.2,0.2) )
<sympy.plotting.plot.Plot at 0x24cefdfa3a0>
2계 비제차 미분방정식¶
$$ y'' + 2 y' + 0.75 y = 2 \cos x - 0.25 \sin x + 0.09 x , \qquad y(0)= 2.78, \quad y'(0)=-0.43 $$
함수 y(x) 를 선언하고, 미분 방정식을 기술한다.
y(x)
deq = Eq( y(x).diff(x,2) + 2*y(x).diff(x) + 0.75*y(x), 2*cos(x)-0.25*sin(x)+0.09*x )
deq
dsolve() 함수의 인자에 초기조건을 ics= {...} 로 전달하여, 초기조건이 적용된 특정해를 얻는다.
sol = dsolve( deq, ics= { y(0):2.78, y(x).diff(x).subs(x,0):-0.43 } )
sol
plot( sol.rhs, (x,0,20) )
<sympy.plotting.plot.Plot at 0x24cefb0ae50>
연립 미분 방정식¶
함수 $y_1(t), y_2 (t)$ 를 선언한다.
y1, y2 = symbols('y1 y2', cls=Function)
y1(t)
y2(t)
미분 방정식을 기술한다.
eq1 = Eq( y1(t).diff(t), -0.02*y1(t)+0.02*y2(t) )
eq1
eq2 = Eq( y2(t).diff(t), 0.02*y1(t)-0.02*y2(t) )
eq2
dsolve() 함수로 일반해를 얻는다.
dsolve( [ eq1, eq2 ] )
dsolve() 함수에 초기조건을 ics= {...} 으로 전달하여, 특정해를 얻는다.
sol = dsolve( [ eq1, eq2 ], ics= { y1(0):150, y2(0):0 } )
sol
그래프로 그린다.
plot( sol[0].rhs, sol[1].rhs , (t,0,100) )
<sympy.plotting.plot.Plot at 0x24cefeae220>
비제차 연립 미분 방정식¶
\begin{align} {y_1} ' &= -3 y_1 + y_2 - 6 e ^ {-2t} \\ {y_2} ' &= \quad y_1 -3 y_2 + 2 e ^ {-2t} \end{align}함수 $y_1(t), y_2 (t)$ 를 선언한다.
y1, y2 = symbols('y1 y2', cls=Function)
y1(t)
y2(t)
미분 방정식을 기술한다.
eq1 = Eq( y1(t).diff(t), -3*y1(t)+y2(t)-6*exp(-2*t) )
eq1
eq2 = Eq( y2(t).diff(t), y1(t)-3*y2(t)+2*exp(-2*t) )
eq2
dsolve() 함수로 일반해를 얻는다.
dsolve( [ eq1, eq2 ] )
last updated in 2022.3
안녕하세요! 혹시 상미분 방정식의 특정해를 구하고 그래프를 얻었을때 여러개의 그래프를 합치는 방법에 대해서 여쭤봐도 괜찮을까요??
답글삭제예를 들어 2계 미분방정식의 그래프 에서 초기값 y(0), y'(0) 값은 동일하고 y''+10y'+9y=0인 것과
y''+6y'+9y=0 이 두 그래프에서 특정해를 구하고 이 두 그래프를 한번에 겹쳐서 나타내는 법이 궁금합니다 !