```python
# 그래프, 수학 기능 추가
# Add graph and math features
import pylab as py


```

# 수치 적분<br>Numerical Integration



면적이 2인 원의 반지름을 구해 보자.<br>Let's find the radius of a circle with area of 2.



$$
\begin{align}
    \pi r^2 &= 2 \\
    r^2 &= \frac{2}{\pi} \\
    r &= \sqrt{\frac{2}{\pi}}
\end{align}
$$




```python
r = py.sqrt(2.0 / py.pi)


```


```python
r


```

이러한 원의 중심이 원점에 위치하고 있다고 생각해 보자.<br>Let's assume that a circle of such radius has its center at the origin.



$$
x^2 + y^2 = r^2 \\
y^2 = r^2 - x^2 \\
y = \pm \sqrt{r^2 - x^2}
$$




```python
x_array = py.linspace(-r, r)
y_plus = py.sqrt(r**2 - x_array ** 2)
y_minus = -py.sqrt(r**2 - x_array ** 2)

py.plot(x_array, y_plus)
py.plot(x_array, y_minus)

py.axis('equal')
py.grid(True)


```

$+$ 부분만 생각하기로 하자.<br>Let's just think about the $+$ side only.



$$
y = \sqrt{r^2 - x^2}
$$




```python
x_array = py.linspace(-r, r)
y_plus = py.sqrt(r**2 - x_array ** 2)

py.fill_between(x_array, y_plus)

py.axis('equal')
py.grid(True)


```

이 반원의 면적을 수치적으로 구해보기로 하자.  (반원의 정확한 값은 얼마이겠는가?)<br>
Let's try to numerically find the area of this half-circle. (What would be the exact value?)



## 0차 적분<br>0th Order Integration



우선 $x$를 일정 간격으로 나누어 보자.<br>Let's divide the $x$ coordinates in a constant interval.




```python
d = r * 2.0

n = 10

x_interval = d / n

x_array_bar = py.arange(-r, r+x_interval*0.1, x_interval)
y_array_bar = py.sqrt(abs(r**2 - x_array_bar ** 2))
x_interval = x_array_bar[1]-x_array_bar[0]

py.fill_between(x_array, y_plus)
# TODO : 막대그래프 직사각형 안을 칠하지 않으려면 어떻게 하면 좋겠는가?
# TODO : How can we remove the color inside the rectangle?
py.bar(x_array_bar, y_array_bar, width=x_interval, alpha=0.5, align='edge')

py.axis('equal')
py.grid(True)


```

직사각형의 모양과 반원의 모양이 정확히 일치하지는 않는다는 점을 기억하자.<br>
Let's remember that the areas of the rectangles and the half circle are not exactly the same.



각 직사각형의 면적을 구해서 더해 보자<br>Let's find the area of each rectangle and sum up.



$$
    Area = \sum_{k=0}^{n-1} F_k
$$



$$
    F_k = f(x_k)\cdot \Delta x
$$




```python
summation = 0

for i, y_i in enumerate(y_array_bar[:-1]):
    area_i = x_interval * y_i
    print('i = %2d, area_i = %g' % (i, area_i))
    summation += area_i

print('summation =', summation)


```

예상한 값 1에 더 비슷한 값을 얻기 위해 더 잘게 나누어 보자<br>To obtain the result closer to the expected value of 1, let's divide with a narrower interval.




```python
n = 100

delta_x = 2.0 * r / n

x_array_bar = py.arange(-r, r+delta_x*0.1, delta_x)
y_array_bar = py.sqrt(r**2 - x_array_bar ** 2)
x_interval = x_array_bar[1]-x_array_bar[0]

py.fill_between(x_array, y_plus)
# TODO : 막대그래프 직사각형 안을 칠하지 않으려면 어떻게 하면 좋겠는가?
# TODO : How can we remove the color inside the rectangle?
py.bar(x_array_bar, y_array_bar, width=x_interval, alpha=0.5, align='edge')

py.axis('equal')
py.grid(True)


summation = 0

for i, y_i in enumerate(y_array_bar[:-1]):
    area_i = x_interval * y_i
    summation += area_i

print('summation =', summation)


```

더 잘게 나눈 결과에 대한 의견은 어떠한가?<br>
What is your opinion about using the narrower interval?



### 함수로 구현<br>Implement in a Function



다양한 경우에 더 편리하게 적용하기 위해 함수 형태로 만들어 보자.<br>To make it more convenient to apply to various cases, let's implement in a function




```python
def half_circle(x):
    return py.sqrt(r**2 - x ** 2)


```


```python
def num_int_0(f, xi, xe, delta_x):
    x_array = py.arange(xi, xe+delta_x*0.1, delta_x)
    
    integration_result = 0.0
    
    for x_i in x_array:
        y_i = f(x_i)
        area_i = delta_x * y_i
        integration_result += area_i
    
    return integration_result


```


```python
n = 100
result = num_int_0(half_circle, -r, r, 2*r/n)
print('result =', result)


```

도전 과제 1: $sin \left( cos x \right)$ 를 $0 \le x \le 1$ 구간에서 적분하시오.<br>Try this 1: Integrate $sin \left( cos x \right)$ over $0 \le x \le 1$ interval. <br>
(ref : [Examples for
Numerical Integration](https://www.wolframalpha.com/examples/mathematics/applied-mathematics/numerical-analysis/numerical-integration/), Wolfram Alpha, Accessed Aug 28 2018)



도전 과제 2: 이전 단원으로부터 이분법 함수를 복사하여 면적이 2인 원의 반지름을 구하는 프로그램을 작성하고 실행해 보시오.<br>Try this 2: Duplicate the bisection method function, write a program finding radius of a circle with area of two, and run it.



## Final Bell<br>마지막 종




```python
# stackoverfow.com/a/24634221
import os
os.system("printf '\a'");


```


```python



```

bd5afc400c47b94daf24a2f93f0198aa45fb40c2
ipynb
Jupyter Notebook
30_num_int/00_zeroth_order.ipynb
cv2316eca19a/nmisp
731a01bc687f3380ddf370d45c3a286f754b45cb
BSD-3-Clause
30_num_int/00_zeroth_order.ipynb
cv2316eca19a/nmisp
731a01bc687f3380ddf370d45c3a286f754b45cb
BSD-3-Clause
30_num_int/00_zeroth_order.ipynb
cv2316eca19a/nmisp
731a01bc687f3380ddf370d45c3a286f754b45cb
BSD-3-Clause
Qwen/Qwen-72B
1. YES
2. YES