[Python]머신 엡실론, 가우스 소거법, SymPy
머신 엡실론(Machine Epsilon)
-
컴퓨터는 숫자 실수를 bit수로 하여 유한하게 가지기 때문에 생기는 한계를 머신 엡실론이라 한다.
-
기호 : ε
- 1 + ε != 1
# 컴퓨터가 가지는 한계(머신 엡실론) 때문에 False인 것이다.
print(0.1 + 0.2 == 0.3)
False
print(0.1 + 0.2 == 0.3)
print(0.3)
print((0.1+0.2)-0.3) # 오차
False 0.3 5.551115123125783e-17
오차가 엡실론 만큼인지 확인법
import sys
import numpy as np
print(np.abs((0.1+0.2)-0.3) <= sys.float_info.epsilon) # float의 머신엡실론
print(np.isclose(0.1+0.2, 0.3)) # 두수가 머신엡실론 안으로 들어오는지 확인하는 함수(가까운수인지)
True True
가우스 소거법
- 선형 시스템을 컴퓨터로 해결하는 방법이다.
- 아래 출력 일부분 예시 :
(15*a)+(-2*b)+(-6*c)+(0*d) = 300
- 함수 결과 :
a=26, b=9, c=13, d=6
- 검산 :
(15*26)+(-2*9)+(-6*13)+0 = 대략300
- 아래 출력 일부분 예시 :
- 또다른 예시
A = np.array(
[[15,-2,-6,0],
[-2,12,-4,-1],
[-6,-4,19,-9],
[0,-1,-9,21]])
B = [300,0,0,0]
X = np.linalg.solve(A,B)
print(X) # 해를 구한것
[26.54915785 9.35370153 13.25499412 6.12612613]
근의 위치 찾기 - SymPy
import numpy as np
import sympy as sp
a = sp.symbols("a")
type(a)
sympy.core.symbol.Symbol
# 해당 식을 풀어서 a를 구할것임
f = a*sp.cosh(50.0/a)-(a+10.0)
f
a*cosh(50.0/a) - a - 10.0
equation = sp.Eq(a*sp.cosh(50.0/a), a+10)
sp.nsolve(equation, [100,200]) # 범위를 넣어주면 훨씬 빨리 찾는다.
# 이 범위는? 우리가 해결해야 할 알고리즘(이분법을 통해 범위축소해서 넣어주면 더 좋지 않을까 싶다)
126.632436039989
댓글남기기