[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

댓글남기기