Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 빅세타
- 알고리즘 분석의 실례
- one-to-one
- python
- 빅오 표기법
- 랜덤 순서 배열
- 코틀린 시작하기
- itertools
- Big-O 예제
- nontrivial solution
- 코틀린 Hello World!
- Big-Oh notation
- 일차변환
- recursive algorithms
- Big Omega
- matrix trnasformations
- 이진 탐색
- NumPy
- 빅오메가
- Big-Oh 예제
- Big Theta
- matrix fo a linear transformation
- matrix-vector product
- trivial solution
- 배열 섞기
- solutions of matrix equation
- 재귀함수
- linear dependence
- nonhomogeneous linear system
- homogeneous linear system
Archives
- Today
- Total
코딩 연습
(파이썬) 함수의 극댓값, 극솟값, 최댓값, 최솟값 구하기 본문
반응형
(파이썬 & 수학) 미분계수 구하기 를 먼저 보고 오세요.
미분이 가능한 함수라면 극대 혹은 극소가 되는 점에서 \(f'(x)=0\) 이 된다는 것을 이미 배워서 알고 있다. 또한 이계도함수가 존재한다면 극대가 되는 점에서는 \(f''(x) <0\), 극소가 되는 점에서는 \(f''(x)>0\) 이 되는 것도 알고 있으리라 믿어 의심치 않는다.
위의 내용을 이용하여 함수 \(f(x)=3x^3 +2x^2-5x+1\) 의 구간 \([-1.5, 1.5]\) 에서 극댓값, 극솟값, 최댓값, 최솟값을 구해보자.
>>> from sympy import * # ①
>>> x = Symbol('x')
>>> f = 3 * x**3 + 2 * x**2 - 5 * x + 1 # ②
>>> derivative1 = Derivative(f, x).doit() # ③
>>> critical = solve(derivative1) # ④
>>> critical.sort() # ⑤
>>> critical # ⑥
[-1, 5/9]
>>> derivative2 = Derivative(f, x, 2).doit() # ⑦
>>> derivative2.subs({x:critical[0]}) # ⑧
-14
>>> derivative2.subs({x:critical[1]}) # ⑨
14
>>> f.subs({x:-1}) # ⑩
5
>>> f.subs({x:5/9}) # ⑪
-0.646090534979424
>>> f.subs({x:-1.5}) # ⑫
2.87500000000000
>>> f.subs({x:1.5}) # ⑬
8.12500000000000
① sympy 패키지의 모든 것(*)을 가져온다.
② 함수 f(x)를 정의한다.
③ 도함수 f'(x) 를 derivative1 이라 하자.
④ f'(x)=0 의 근을 critical 에 저장
⑤ critical을 오름차순으로 정렬
⑥ critical 은 f'(x)=0 의 해를 리스트의 형태로 갖고 있음
⑦ 이계도함수 f''(x) 를 derivative2 라 하자.
⑧ f'(x)=0 의 근 중 작은 것을 f''(x) 에 대입했더니 음수, 즉 이 점에서 극대
⑨ f'(x)=0 의 근 중 큰 것을 f''(x) 에 대입했더니 양수, 즉 이 점에서 극소
⑩ 극댓값 계산
⑪ 극솟값 계산
⑫ 구간의 왼쪽 끝점에서의 함숫값
⑬ 구간의 오른쪽 끝점에서의 함숫값
위의 코드를 하나씩 잘 살펴 본다면 다른 설명이 필요 없으리라 생각된다.
마지막에서 극대, 극소와 구간의 양 끝점에서의 함숫값을 비교하여 가장 큰 놈 f(1.5) 가 최댓값이 되고, 가장 작은 놈 f(5/9) 가 최솟값이 된다. 이 정도만 알고 있다면 극대, 극소, 최대 , 최소를 구하는 코딩이 충분히 가능할 것이라 판단된다.
참고
함수 f 가 \(f(x)=x^3 +2x^2 -3x+1\) 과 같이 주어지게 되면 다음과 같은 문제가 생긴다.
>>> f = x**3 + 2 * x**2 - 3 * x + 1
>>> derivative1 = Derivative(f, x).doit()
>>> critical=solve(derivative1, x)
>>> critical
[-2/3 + sqrt(13)/3, -sqrt(13)/3 - 2/3]
>>> f.subs({x:critical[0]})
-sqrt(13) + (-2/3 + sqrt(13)/3)**3 + 2*(-2/3 + sqrt(13)/3)**2 + 3
즉, \(f'(x)=0\) 의 근이 무리수가 되어, 이 근을 함수 \(f\) 에 대입하여도 그 계산된 결과를 볼 수 없게 된다. 여전히 무리수가 등장하는 값을 결과로 보여준다. 이때, 계산된 결과(근삿값)을 보고 싶다면 다음과 같이 evalf() 매서드를 사용하면 된다.
>>> f.subs({x:critical[0]}).evalf()
0.120580253256899
반응형
'Python' 카테고리의 다른 글
(파이썬) 순열 -모든 경우 나열하기 (0) | 2017.03.21 |
---|---|
(파이썬) 부정적분과 정적분 (0) | 2016.03.15 |
(파이썬) 미분계수 구하기 (4) | 2016.03.15 |
(파이썬) 극한값 구하기 (0) | 2016.03.15 |
(파이썬) 집합 (0) | 2016.03.15 |
Comments