과외를 하다가 구분구적법을 간단한 코드를 통해 실제로 makes sense한다는 것을 보여주면 좋을 것 같아, 수업시간에 급히 코드를 짜보았습니다.
0. 구분구적법이란?
고등학교 수학 교육과정에서 구분구적법은 정적분을 정의하는 하나의 방법으로써, 곡선으로 둘러싸인 도형의 넓이는 그 도형에 내접 혹은 외접하는, 무수히 많은 작은 직사각형 넓이의 합과 같다는 것입니다. 무슨 이야기인지 모르겠으니까, 아래 그림을 봅시다.
곡선 y=x^2과 x축, x=1로 둘러싸인 부분의 넓이를 구하는데 있어, 이 영역을 밑변이 1/n이고, 높이가 (k/n)^2인 직사각형으로 무수히 잘게 자를 수 있습니다.
위 그림에서 도형의 넓이는 $\sum \left ( \frac{k}{n}\right )^{2} \cdot \frac{1}{n} = \frac{1}{6}\left ( 1+\frac{1}{n} \right )\left ( 2+\frac{1}{n} \right )$ 으로 극한값이 정적분 값인 $\int_0^1\ x^{2}dx=1/3$과 일치하는 것을 볼 수 있습니다.
한편, 아래의 그림과 같이 밑변이 1/n이고, 높이가 (k-1/n)^2인 직사각형의 합을 구하더라도, 극한값에는 별 영향을 주지 못한다는 것을 알 수 있습니다.
$\sum \left ( \frac{k-1}{n}\right )^{2} \cdot \frac{1}{n} = \frac{1}{6}\left ( 1-\frac{1}{n} \right )\left ( 2-\frac{1}{n} \right )$ 또한 극한값이 정적분 값인 1/3값과 같습니다.
이 글은 미적분과 통계 기본이나, 적분과 통계 (아재;) 상의 미적분 교육과정을 성실히 이수한 분을 대상으로 하여, 적분의 기본 컨셉을 알고 있다는 가정 하에 코드에 관해 설명해보고자 합니다.
1. 코딩을 통해 보이고자 하는 사항
[0,1]에서 정의된 함수 $f(x)= x^{2}+1$에 대해, 파란색 사각형의 합 ≈ f(x)와 x축으로 둘러싸인 넓이 ≈ 빨간색 사각형의 합임을 보이고자 합니다.
2. 수업 때 후딱 짠 코드
과외생에게 최소한 어떻게 돌아가는지를 설명하기 위해, 패키지 함수의 남용을 지양하고 되도록 for문을 써서 보여주었습니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
for n in range(10,101,10): # n=10,20,30,,,,100으로 n등분 함.
s=0 #파란색 넓이
print ('횟수','직사각형 넓이','오차')
# 0부터 n까지의 i에 대해 아래에서 정해준 작업을 반복합니다. (반복문)
for i in range(0,n):
x = i / n # x를 [0,1]사이에서 n등분 해줍니다. x값이 0, 1/n, 2/n, 3/n....1-1/n으로 증가합니다.
y = x**2 + 1
s += (1/n) * y
e= abs(s-4/3) # 원래 정적분 값과의 오차를 구합니다.
print(n,s,e)
|
cs |
#콘솔 결과창
횟수 직사각형 넓이 오차
10 1.2850000000000001 0.04833333333333312
20 1.3087499999999999 0.0245833333333334
30 1.316851851851852 0.01648148148148132
40 1.3209374999999999 0.012395833333333384
50 1.3233999999999997 0.009933333333333572
60 1.3250462962962963 0.008287037037036926
70 1.3262244897959186 0.0071088435374147
80 1.3271093749999998 0.006223958333333446
90 1.327798353909465 0.005534979423868158
100 1.3283499999999997 0.004983333333333562
정적분값과 직사각형 넓이의 합으로 정의된 오차가 급격히 줄어드는 것을 확인할 수 있습니다.
3. 수업 끝나고 집가는 길에 짠 코드
1000등분정도까지 해서 N의 증가에 따라 오차의 급격한 감소를 플롯팅하면 좋겠다는 생각이 들었습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import matplotlib.pyplot as plt
S1=[] #작은 직사각형 넓이의 합
S2=[] #큰 직사각형 넓이의 합
ST=[] #정적분 값 (4/3)
X=[] #x값
for j in range(990):
ST.append(4/3) # 정적분 값 4/3입니다.
X.append(j) # 그래프 그리기 위해 0부터 899까지 세워줌
# 아까랑 똑같은 코드 (파란색 부분 넓이 구하기, n은 10부터 999까지)
for n in range(10,1000):
s=0
for i in range(0, n):
x = i / n
y = x**2 + 1
s += (1/n) * y
S1.append(s) # S1이라는 리스트에 n에 따른 파란색 넓이의 합을 저장
# 빨간 테두리 사각형의 합. 위에랑 구성은 똑같은데 x 시작점이 달라짐
for n in range(10,1000):
s=0
for i in range(1,n+1):
x = i / n
y = x**2 + 1
s += (1/n) * y
S2.append(s)
#플롯 그리기
plt.subplot(111)
plt.plot(X,S1,X,S2,X,ST)
plt.show()
|
cs |
위의 코드와 비교해서 빨간색 부분의 넓이를 구하는 for문과 플롯 그려주는 부분이 추가되었습니다.
4. 결과
초록색 선은 정적분 값인 4/3인데, 처음에는 꽤 큰 차이가 나다가 점점 정적분 값에 수렴해 나감을 확인할 수 있습니다.
5. Reference
"고등학교 심화수학 2", 한국과학창의재단
'프로그래밍 이야기 > Python' 카테고리의 다른 글
Python으로 Neural Net 체험하기 (0): 단층 신경망 최적화 (0) | 2020.05.02 |
---|---|
Pandas로 열이 뒤죽박죽인 엑셀, csv 합치기 (3) | 2020.04.30 |