기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

적분방법

내용

적분방법

어떤 것을 적분하기 위해서는 그들을 적분할 수 있는 형태로 재구성하는 것으로부터 시작합니다. 이러한 재구성에는 다양한 방법들이 적용됩니다.

부분적분

식 1과 같이 미분의 곱법칙을 적분에 적용할 수 있습니다.

(1)d(uv)=u·dv+v·duu·dv=d(uv)v·duu·dv=d(uv)vdu=uvv·du+C

식 1에서 u는 정상함수, dv는 미분된 함수를 나타냅니다.

식 1은 식 2와 같이 부분적분 공식으로 정리할 수 있습니다.

부분적분 (2)[f(x)·g(x)]dx=f(x)g(x)dx[df(x)dxg(x)]dx

부분 적분의 몇 가지 예제들을 계산해 봅니다.

예)
  함수 w·sin(w)의 경우 직접 적분하기는 어렵지만 두 식의 곱으로 구성되어 있으므로 부분 적분을 적용할 수 있습니다. 즉, w를 원함수 u로 하고 sin(w)를 미분된 함수 dv라고 한다면 다음과 같이 전개할 수 있습니다.

u=w,sin(w)=dvsin(w)dw=cos(w)=vw·sin(w)dw=w(cos(w))(cos(w))dw+C=w·cos(w)+sin(w)+C

위 부분적분의 과정에 따라 코드를 작성해 보면 다음과 같습니다.

import numpy as np
from sympy import *
w = symbols("w")
y=w*sin(w)
u=w
dv=sin(w)
uInt_dv=u*integrate(dv, w)
int_vdu=integrate(integrate(dv, w)*diff(u, w))
re=uInt_dv-int_vdu
re
wcos(w)+sin(w)

위 결과는 함수 y를 직접 적분한 것과 같아야 합니다.

integrate(y, w)
wcos(w)+sin(w)

예)
xexdx? u=x,dv=exv=exdx=exx·exdx=x·exexdx=x·exex+C

x = symbols("x")
y=x*exp(x)
u=x
dv=exp(x)
uInt_dv=u*integrate(dv, x)
int_vdu=integrate(integrate(dv, x)*diff(u, x))
re=uInt_dv-int_vdu
re
xexex
integrate(y, x)
(x1)ex

예)
cos2(θ)dθ? cos(θ)=u,cos(θ)=dvsin(θ)=vcos2(θ)dθ=cos(θ)sin(θ)+sin2(θ)dθ=sin(2θ)2+(1cos2(θ))dθ=sin(2θ)2+dθcos2(θ)dθ2cos2(θ)dθ=sin(2θ)2+θcos2(θ)dθ=sin(2θ)4+θ2+Csin(θ+θ)=2sin(θ)cos(θ)

theta=symbols("theta")
y=cos(theta)**2
u=cos(theta)
dv=cos(theta)
uInt_dv=u*integrate(dv, theta)
int_vdu=integrate(integrate(dv, theta)*diff(u, theta), theta)
uInt_dv-int_vdu
θ2+sin(θ)cos(θ)2
integrate(y, theta)
θ2+sin(θ)cos(θ)2

예)
x2sin(x)dx? u=x2,v=sin(x)dxx2sin(x)dx=x2cos(x)+2xcos(x)dx=x2cos(x)+2[xsin(x)sin(x)dx]=x2cos(x)+2xsin(x)+2cos(x)+C

위 식의 xcos(x)의 계산은 부분 적분을 다시 적용합니다.

x= symbols("x")
y=x**2*sin(x)
u=x**2
dv=sin(x)
uInt_dv=u*integrate(dv, x)
int_vdu=integrate(integrate(dv, x)*diff(u, x))
re=uInt_dv-int_vdu
re
x2cos(x)+2xsin(x)+2cos(x)
integrate(y, x)
x2cos(x)+2xsin(x)+2cos(x)

예)
1x2dx? 1x2dx=1x21x2dx=11x2dxx21x2dx

위 결과의 우항의 첫 번째 항은 y=arcsin(x)의 미분 결과입니다. 위 결과는 다음과 같이 삼각함수로 치환하여 적분할 수 있습니다.

다음 함수의 적분에서 함수의 분모는 반지름이 1인 반원의 식과 같습니다.

11x2dx
import matplotlib.pyplot as plt
x=np.linspace(-1, 1, 100)
y=np.sqrt(1-x**2)
plt.figure(dpi=100)
plt.plot(x, y, label=r"$y=\sqrt{1-x^2}$")
plt.scatter(0.8, np.sqrt(1-0.8**2), label="(0.8, 0.6)")
plt.arrow(0, 0, 0.8, np.sqrt(1-0.8**2))
plt.arrow(0, 0, 0.8, 0)
plt.arrow(0.8, 0, 0, np.sqrt(1-0.8**2))
plt.legend(loc="upper left")
plt.text(0.72, 0.5, r"$\mathbf{\theta}$")
plt.text(0.5, 0.43, 1)
plt.text(-0.5, 0.5, r"$\mathbf{\sin(\theta)=\frac{x}{1}}$")
plt.text(-0.5, 0.38, r"$\mathbf{\cos(\theta)d\theta=dx}$")
plt.show()
그림 1.y=1x2.

그러므로 다음과 같이 치환에 의해 적분을 실행할 수 있습니다.

11x2dx=11sin2(θ)cos(θ)dθ=1cos(θ)cos(θ)dx=θ=sin1(x)
x=symbols("x")
diff(asin(x))
11x2

위 결과들을 적용하면 결과는 다음과 같습니다.

1x2dx=x1x22+12arcsin(x)+C
y=(sqrt(1-x**2))
integrate(y,x)
x1x22+asin(x)2

치환적분

이 방법은 치환 미분과 같은 방식으로 이루어집니다. 즉, 적분 대상을 적분인자와 같은 형식으로 치환하여 계산하는 방법입니다.

예)
3+xdx에서 3+x를 u로 치환하면 간단한 형태로 변환할 수 있습니다.

3+x=udx=duudu=23u23+C=23(3+x)23+C
x= symbols("x")
y=(sqrt(3+x))
integrate(y,x)
2(x+3)323

예)
1ex+1exdx?

exp(x)=u,exp(x)dx=dudx=1udu1exp(x)+exp(x)dx=1u(u+1u)du=1u2+1du=tan1(u)=tan1(exp(x))

위 전개 과정에서 1u2+1tan1(x)의 미분 결과입니다.

dx, x, u= symbols("dx, x, u")
eq1=Eq(u, exp(x))
diff(eq1, x)
xu=ex
u1=exp(x)
y=(u*(u+1/u))**(-1)
y
1u(u+1u)
integrate(y, u)
atan(u)

예)
(x2+2x+3)1의 적분? x+1=u,dx=du1x2+2x+3dx=1x2+2x+1+2dx=1(x+1)2+(2)2dx=1u2+(2)2du

위 전개 과정의 마지막 식은 다음의 함수 y의 미분 결과와 같습니다. 역으로 그 마지막 식의 적분 결과는 다음 코드와 같습니다.

y=1atan1(u)dydu=1u2+a2
x=symbols("x")
y= 1/(x**2+2*x+3)
integrate(y, x)
2atan(2x2+22)2

위 예제들은 이항 및 삼각함수 표현에 적용할 수 있는 특수한 형태이며, 알려진 적분 결과로 전환된 것입니다. 즉, 분모의 통분 및 인수 분해는 특별한 경우에 적용 할 수 있는 방법으로 프로그밍이 아닌 직접 계산을 실행할 경우 익숙해지려면 많은 연습이 필요합니다. 또한 적분의 영역을 복소수 영역으로 확장한다면 더 복잡한 결과를 얻을수 있습니다. 예를 들어 이 예의 x2 + 2x + 3은 복소수 부분을 포함한다면 다음과 같이 인수분해 됩니다.

이 식에서 x의 해를 계산하기 위해 다음 코드에서 roots()함수를 적용하였습니다.

roots(x**2+2*x+3)
{-1 - sqrt(2)*I: 1, -1 + sqrt(2)*I: 1}

이 결과를 적용하여 위 함수 y를 부분분수로 분해하여 적분할 수 있습니다.

y=1/(2*sqrt(2)*I)*(1/(x+1 + sqrt(2)*I)+1/(x+1- sqrt(2)*I))
integrate(y, x)
2ilog(x2+2x+3)4

다른 수학 계산과 같이 적분 역시 계산의 한계 조건 등에 따라 다양한 답들이 존재할 수 있으며 무한대 또는 0으로 나누어지는 경우에는 명확한 답을 도출할 수 없습니다. 즉, 모든 경우에 사용할 수 있는 방법은 없습니다. 그러므로 적분 실행 시 이러한 조건들을 정해놓는 것이 중요합니다.

예)
y=1a2x2를 적분합니다.

이 함수는 부분 분수로 전환하여 시행할 수 있습니다.

a, x=symbols("a, x")
y=1/(a**2-x**2)
y
1a2x2
#부분분수 
y1=apart(y, x)
y1
12a(a+x)12a(a+x)
#부분분수를 적분 
simplify(integrate(y1, x))
log(a+x)+log(a+x)2a
#부분분수 적용없이 직접 적분 
simplify(integrate(y, x))
log(a+x)+log(a+x)2a

댓글

이 블로그의 인기 게시물

[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 실수...