테일러 급수 방법 문서의 구현 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""테일러 급수 방법(상미분방정식) 구현과 검증. y' = x + y, y(0) = 1, 참값 y = 2eˣ − x − 1."""
import math
def taylor_step(x, y, h, k):
"""y' = x + y이면 y'' = 1 + x + y, y''' 이상도 1 + x + y."""
d = [x + y] + [1 + x + y] * (k - 1) # f, f', f'', ... (전미분)
T = sum(h ** j / math.factorial(j + 1) * d[j] for j in range(k))
return y + h * T
def solve(k, h, X=1.0):
n = round(X / h); x, y = 0.0, 1.0
for _ in range(n):
y = taylor_step(x, y, h, k); x += h
return y
def main():
exact = 2 * math.e - 2
# k = 1은 오일러 방법
x, y, h = 0.0, 1.0, 0.1
assert taylor_step(x, y, h, 1) == y + h * (x + y)
# 전역 오차의 차수: h를 반으로 줄이면 오차가 2^k분의 1
for k in (1, 2, 3, 4):
e1 = abs(solve(k, 0.1) - exact); e2 = abs(solve(k, 0.05) - exact)
ratio = e1 / e2
assert abs(math.log2(ratio) - k) < 0.2, (k, ratio)
# 카드 C2: h = 0.1, 한 걸음, k = 2
y1 = taylor_step(0.0, 1.0, 0.1, 2)
assert abs(y1 - (1 + 0.1 * 1 + 0.01 / 2 * 2)) < 1e-15 and abs(y1 - 1.11) < 1e-15
print("k별 오차(h=0.1):", ["%.1e" % abs(solve(k, 0.1) - exact) for k in (1, 2, 3, 4)])
print("ALL CHECKS PASSED")
if __name__ == "__main__":
main()