기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

선형미분방정식

선형미분방정식(Linear Differential Equations)

다음 식 1은 가장 높은 차수가 1차 미분을 포함하는 전형적인 선형 1계 미분방정식입니다. 기본적으로 이 형태의 방정식을 풀기 위해서는 좌항 전체를 적분 가능한 형태로 전환해 줍니다. (1)dydt+p(t)y=g(t) 식 1의 p(t)와 g(t)는 연속함수입니다. 식 1의 좌항은 특정한 함수를 첨가함으로 식 2와 같은 미분의 곱의 형태와 유사하게 만들 수 있습니다. (2)ddx(f(x)μ(x))=d[f(x)]dxμ(x)+f(x)d[μ(x)]dx 식 1을 식 2와 같은 형태로 만들기 위해 식 1의 양변에 μ(t)를 곱해줍니다. 이 함수를 적분인자(integrating factor)라고 합니다. (3)μ(t)dydt+μ(t)p(t)y=μ(t)g(t) 적분인자를 고려한 식 3을 식 2와 비교하면 식 4를 가정할 수 있습니다. (4)μ(t)p(t)=μ(t)μ(t)μ(t)=p(t) 위의 가정으로 2의 좌항에 미분의 곱법칙을 적용될 수 있습니다. μ(t)dydt+μ(t)y=(μ(t)y)=μ(t)g(t)μ(t)g(t)=(μ(t)y) 위 식의 양변을 적분하여 y (또는 y(t))를 다음과 같이 정리할 수 있습니다. μ(t)g(t)dt=(μ(t)y(t))dt=μ(t)y(t)+Cy(t)=μ(t)g(t)dt+Cμ(t) 다음으로 μ(t)를 결정합니다. μ(t)p(t)=μ(t)p(t)=μ(t)μ(t) 위 식의 우항은 로그함수의 미분 결과입니다. p(t)=(lnμ(t))(lnμ(t))dt=p(t)dtlnμ(t)+k=p(t)dtlnμ(t)=p(t)dt+k C와 마찬가지로 k는 상수이며 부호는 그 상수 심벌에 포함되는 것으로 고려합니다. 위 식에서 μ(t)를 추출하기 위해 지수함수화 합니다. μ(t)=exp(p(t)dt+k)=exp(k)exp(p(t)dt)=kexp(p(t)dt) 위 결과를 y(t)에 대입하면 y(t)=μ(t)g(t)dt+Cμ(t)=[kexp(p(t)dt)g(t)]dt+Ckexp(p(t)dt)=[exp(p(t)dt)g(t)]dt+Ckexp(p(t)dt)=[exp(p(t)dt)g(t)]dt+Cexp(p(t)dt) 결과적으로 1계 선형미분방정식의 해는 다음과 같이 나타낼 수 있습니다. y(t)=μ(t)g(t)dt+Cμ(t),μ(t)=exp(p(t)dt)

예)
다음 미분방정식의 해를 결정합니다. dvdt=9.80.196v

μ(t)dvdt+μ(t)0.196v=μ(t)9.8ifμ(t)0.196=μ(t)(μ(t)v)=μ(t)9.8(μ(t)v)dt=μ(t)9.8dtμ(t)v+C=μ(t)9.8dtv=μ(t)9.8dt+Cμ(t) μ(t)μ(t)=(ln(μ(t)))=0.196μ(t)=exp(0.196t+k)=exp(0.196t)exp(k) 위의 v에 μ(t)를 대입하면 다음과 같습니다. v=exp(0.196t)exp(k)9.8dt+Cexp(0.196t)exp(k)=exp(0.196t)9.8dt+C/kexp(0.196t)=9.80.196exp(0.196t)+Cexp(0.196t)=50+Cexp(0.196t)
t, C=symbols('t C')
ans=(integrate(exp(0.196*t)*9.8, t)+C)/exp(0.196*t); ans
(C+50.0e0.196t)e0.196t

위 결과는 sympy의 dsolve()함수를 적용한 결과로 확인할 수 있습니다.

v=Function('v')(t)
eq=Eq(v.diff(t), 9.8-0.196*v);eq
ddtv(t)=9.80.196v(t)
sol=dsolve(eq, v); sol
v(t)=C1e0.196t+50.0
위 예의 초기조건 v(0)=8
C1=solve(Eq(ans.subs(t, 0), 8), C); C1
[-42.0000000000000]
dsolve(eq, v, ics={v.subs(t, 0):8})
v(t)=50.042.0e0.196t

예)
다음의 미분방정식의 해를 결정합니다. cos(x)y+sin(x)y=2cos3(x)sin(x)1,y(π4)=32

위 방정식의 미분항의 계수를 1로 만들기 위해 양변을 cos(x)로 나누고 양변에 적분인수 mu(x)를 곱합니다. μ(x)dydx+μ(x)tan(x)y=μ(x)2cos2(x)sin(x)μ(x)sec(x)p(x)=tan(x)μ(x)=exp(tan(x)dx)=sec(x)
x=symbols('x')
mu=exp(integrate(tan(x), x)); mu
1cos(x)
위 식을 정리하면 sec(x)dydx+sec(x)tan(x)y=sec(x)2cos2(x)sin(x)sec2(x)(sec(x)y(x))=2cos(x)sin(x)sec2(x)(sec(x)y(x))dx=(2cos(x)sin(x)sec2(x))dx 위 식의 우항의 적분은 다음과 같습니다. 2cos(x)sin(x)dx=sin2(x)+Cddxtan(x)=ddxsin(x)cos(x)=cos(x)sin(x)+sin(x)cos(x)cos2(x)=sec2(x)
integrate(2*cos(x)*sin(x)-sec(x)**2, x)
sin2(x)sin(x)cos(x)
그러므로 위 식을 정리하면 sec(x)y(x)=sin2(x)tan(x)+Cy(x)=sin2(x)tan(x)+Csec(x)
x=symbols('x')
y=Function('y')(x)
eq=Eq(y.diff(x)+tan(x)*y, 2*cos(x)**2*sin(x)-sec(x));eq
y(x)tan(x)+ddxy(x)=2sin(x)cos2(x)sec(x)
genSol=dsolve(eq, y)
simplify(genSol)
y(x)=C1cos(x)sin(x)cos3(x)
genSol.rhs
C1cos(x)sin(x)cos3(x)
sol=dsolve(eq, y, ics={y.subs(x, pi/4):3*sqrt(2)}); sol
y(x)=sin(x)cos3(x)+15cos(x)2
sol.subs(x, 0).evalf(4)
y(0)=6.5
sol.rhs.subs(x, 0).evalf(4)
6.5
plt.figure(dpi=100)
a=np.linspace(0, 20, 100)
b=np.array([float(sol.rhs.subs(x, i).evalf(4)) for i in a])
plt.plot(a, b)
plt.show()

예)
ty+2y=t2t+1의 해를 결정합니다. 초기조건은 y(1)=12입니다.

y+2ty=t1+1tμ(t)y+μ(t)2ty=μ(t)[t1+1t] 위 식으로 부터 μ(t)=μ(t)2tμ(t)μ(t)=[ln(μ(t))]=2t[ln(μ(t))]dt=2tdtln(μ(t))=2ln|t|=t2μ(t)=elnt2=t2 위 결과를 원 방정식에 대입하면 다음과 같이 정리됩니다. (μ(t)y(t))=t2[t1+1t](t2y(t))dt=(t3t2+t)dtt2y(t)=14t413t3+12t2+Cy(t)=14t213t+12+Ct2 위 결과에 초기조건을 대입하면 C를 결정할 수 있습니다. y(1)=1413+12+C=12C=112y(t)=14t213t+12+112t2
t=symbols('t')
y=Function('y')(t)
eq=Eq(t*y.diff(t)+2*y, t**2-t+1);eq
tddty(t)+2y(t)=t2t+1
dsolve(eq, y, ics={y.subs(t, 1): Rational(1,2)})
y(t)=t24t3+12+112t2

예)
ty2y=t5sin(2t)t3+4t4,y(π)=32π4의 해를 결정합니다.

y2ty=t4sin(2t)t2+4t3μ(t)yμ(t)2ty=μ(t)(t4sin(2t)t2+4t3)μ(t)=μ(t)2tln(μ(t))=2tdtμ(t)=exp(2lnt)t2(t2y(t))dt=(t2sin(2t)1+4t)dt 위 결과에서 t2sin(2t)dt는 부분적분으로 계산됩니다. t2sin(2t)dt=t2cos(2t)2+2tcos(2t)2dt=t2cos(2t)2+tsin(2t)2+14cos(2t)tcos(2t)dt=tsin(2t)212sin(2t)dt=tsin(2t)2+14cos(2t) 그러므로 일반해는 다음과 같습니다. y(t)=t4cos(2t)2+t3sin(2t)2+t214cos(2t)t3+2t4+Ct2 초기조건을 적용하여 C를 결정합니다. (π)=π42+π24π3+2π4+Cπ2=32πC=π+14C=C=π14 최종적으로 이 식의 해는 다음과 같습니다. y(t)=t4cos(2t)2+t3sin(2t)2+t214cos(2t)t3+2t4+(π14)t2
t=symbols('t')
y=Function('y')(t)
eq=Eq(y.diff(t)-2*y/t, t**4*sin(2*t)-t**2+4*t**3)
dsolve(eq, y, ics={y.subs(t, pi):3*pi**4/2})
y(t)=t2(t2cos(2t)2+2t2+tsin(2t)2t+cos(2t)414+π)

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. (1)A=PBP1P1AP=B 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. (식 2)BλI=P1APλP1P=P1(APλP)=P1(AλI)P 식 2의 행렬식은 식 3과 같이 정리됩니다. det(BλI)=det(P1(APλP))=det(P1)det((AλI))det(P)=det(P1)det(P)det((AλI))=det(AλI)det(P1)det(P)=det(P1P)=det(I) 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a sin2(x)+cos2(x) simplify(a) 1 simplify(b) x3+x2x1x2+2x+1 simplify(b) x - 1 c=gamma(x)/gamma(x-2) c Γ(x)Γ(x2) simplify(c) (x2)(x1) 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. (식 1)Γ(n)={(n1)!n:자연수0xn1exdxn:부동소수 x=symbols('x') gamma(x).subs(x,4) 6 factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 x2=1의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. x21=0 import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. x21=0(x+1)(x1)=0x=1or1x4=1의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. x41=(x2+1)(x+1)(x1)=0x=±1,±1=±i,±1 실수...