입니다. 그러니 분자와 분모가 모두 0으로 갈 때 각각을 미분한 것의 비가 답이 되지 않을까 추측할 수 있습니다.
이 문제에서 배우는 것: 로피탈 정리.
(3)의 추측은 참인데, 위의 계산 그대로는 증명이 되지 않습니다. 분자와 분모를 따로 x−a로 나누어 각각 극한을 취하려면 g′(a)=0이 필요하고, 무엇보다 f′과 g′이 a에서 연속이라는 강한 가정이 숨어 있습니다. 제대로 된 증명에는 42강의 코시 평균값 정리가 필요합니다.
로피탈 정리(00 꼴).a를 포함하는 어떤 열린구간에서 a를 뺀 모든 점에서 f와 g가 미분가능하고 g′=0이라 합니다.
x→alimf(x)=x→alimg(x)=0
이고 x→alimg′(x)f′(x)=L이 존재하면(값이 ±∞여도 됩니다)
x→alimg(x)f(x)=L
입니다.
증명. 오른쪽 극한만 보입니다. 왼쪽도 같은 방법이고 둘을 합치면 양쪽 극한이 됩니다.
f(a)=g(a)=0으로 두어 f와 g를 a에서 연속이 되게 다시 정의합니다. 원래 극한은 x=a에서의 값과 무관하므로(34강의 0<∣x−a∣ 조건) 이렇게 해도 답이 달라지지 않습니다.
x>a를 잡으면 f와 g는 [a,x]에서 연속이고 (a,x)에서 미분가능합니다. 코시 평균값 정리에 의해 어떤 c∈(a,x)가 있어
g(x)−g(a)f(x)−f(a)=g′(c)f′(c)
입니다. 왼쪽은 f(a)=g(a)=0이므로 그냥 g(x)f(x)입니다. 이제 x→a+로 보내면 a<c<x이므로 c→a+이고, 가정에서 g′(c)f′(c)→L입니다. 따라서 g(x)f(x)→L입니다. ■
증명이 짧은 이유는 코시 평균값 정리가 이미 무거운 일을 다 했기 때문입니다. 두 함수의 차이의 비를 같은 한 점에서의 도함수의 비로 바꾸는 것이 그 정리의 역할이었고, 로피탈은 그 결과에 극한을 취한 것에 지나지 않습니다.
여기서 왜 평균값 정리로는 안 되고 코시가 필요한지 확인해 두십시오. 평균값 정리를 f와 g에 따로 적용하면 g(x)f(x)=g′(c2)f′(c1)가 되는데 c1=c2입니다. 서로 다른 두 점에서의 값이라 비를 g′f′의 극한으로 넘길 수 없습니다. 코시 평균값 정리는 같은 하나의 c를 주므로 그 문제가 없습니다.
정리는 ∞∞ 꼴에서도 성립하고, x→a 대신 x→∞나 x→−∞, 한쪽 극한에서도 성립합니다. 서술은 심화 1에 모아 두었습니다.
바로 확인 1.
확인 1-1.x→0limxln(1+x)를 로피탈 정리로 구하세요.
답.00 꼴이고 11/(1+x)→1이므로 극한은 1입니다.
확인 1-2.x→1limx−1x3−1을 로피탈 정리와 인수분해 두 방법으로 구해 비교하세요.
답. 로피탈로는 13x2→3입니다. 인수분해로는 x−1(x−1)(x2+x+1)=x2+x+1→3입니다. 두 방법의 답이 같습니다.
확인 1-3. 로피탈 정리의 증명에서 평균값 정리 대신 코시 평균값 정리를 써야 하는 이유를 쓰세요.
답. 평균값 정리를 분자와 분모에 따로 적용하면 두 도함수를 서로 다른 점에서 평가하게 되어 비를 극한으로 넘길 수 없기 때문입니다. 코시 평균값 정리는 두 도함수를 같은 하나의 점에서 평가한 비를 줍니다.
문제. 다음 두 극한을 구하세요.
(1) x→0limx2ex−1−x
(2) x→0limx3x−sinx
생각의 실마리. 로피탈을 한 번 적용해 보고, 결과가 또 부정형이면 조건을 다시 확인한 뒤 한 번 더 적용합니다. 매번 분자와 분모가 모두 0으로 가는지 확인하는 것이 요령입니다. 확인하지 않고 기계적으로 반복하면 문제 3에서 볼 오류가 생깁니다.
풀이. (1) x→0에서 분자 ex−1−x→1−1−0=0이고 분모 x2→0이므로 부정형입니다. 미분하면
2xex−1
이고 이것도 00입니다. 다시 미분하면
2ex⟶21
입니다. 마지막은 부정형이 아니라 그냥 대입되므로 여기서 멈춥니다. 답은 21입니다.
(2) 분자 x−sinx→0이고 분모 x3→0입니다. 세 번 적용합니다.
x3x−sinx→3x21−cosx→6xsinx→6cosx⟶61
각 단계에서 새 분자와 새 분모가 모두 0으로 가는 것을 확인했습니다. 답은 61입니다.
이 문제에서 배우는 것: 반복 적용과 정지 조건.
로피탈 정리를 여러 번 쓸 수 있습니다. 다만 매 단계마다 부정형인지 다시 확인해야 합니다. 절차를 정리합니다.
단계
할 일
1
분자와 분모의 극한을 각각 계산합니다
2
00이나 ∞∞가 아니면 멈추고 직접 계산합니다
3
부정형이면 분자와 분모를 각각 미분합니다
4
새 식으로 1번으로 돌아갑니다
2번이 정지 조건입니다. 부정형이 아닌데 미분하면 답이 달라집니다. 문제 3에서 확인합니다.
(2)의 결과 61은 기억해 둘 값입니다. x가 작을 때 sinx≈x−6x3이라는 뜻이고, 57강의 테일러 급수에서 이 계수가 정확히 다시 나옵니다. 사실 이 강의에서 로피탈로 구하는 극한 대부분은 57강에서 테일러 전개로 훨씬 빠르게 얻어집니다. 로피탈은 테일러를 배우기 전의 도구이면서 동시에 테일러의 계수를 미리 확인하는 도구입니다.
미분이 지저분해질 때는 먼저 정리하는 편이 낫습니다. 예를 들어
x→0limxsinx⋅xex−1
처럼 곱으로 쪼갤 수 있으면 각각의 극한을 따로 구합니다. 34강의 극한법칙이 여기서도 유효하므로, 로피탈을 쓰기 전에 아는 극한을 분리하는 것이 계산량을 크게 줄입니다.
바로 확인 2.
확인 2-1.x→0limx21−cosx를 구하세요.
답. 두 번 적용합니다. 2xsinx→2cosx→21입니다.
확인 2-2.x→0limx3tanx−x을 구하세요.
답. 세 번 적용합니다. 3x2sec2x−1→6x2sec2xtanx→62sec2x(sec2x+2tan2x)→62=31입니다.
확인 2-3. 로피탈 정리를 반복 적용할 때 매 단계에서 확인해야 하는 것은 무엇입니까?
답. 새로 얻은 분자와 분모가 여전히 부정형인지 확인해야 합니다. 부정형이 아니면 즉시 멈추고 값을 직접 계산합니다.
문제. 다음을 판정하세요.
(1) x→0limx+2x+1에 로피탈 정리를 적용하면 어떤 값이 나오고, 참값은 무엇입니까?
(2) x→0limx2sinx에 로피탈을 적용해도 되는지 판정하세요.
(3) x→0+limxcosx는 어떻습니까?
생각의 실마리. 세 문제 모두 계산이 아니라 적용 가능성 판정이 핵심입니다. 먼저 분자와 분모의 극한을 각각 구해 어떤 꼴인지 확인하는 습관을 들입니다. 부정형이 아닌 꼴에는 이름이 따로 있습니다.
풀이. (1) 분자는 1로, 분모는 2로 갑니다. 부정형이 아니므로 그냥 대입해서 참값은 21입니다.
로피탈을 잘못 적용하면 11=1이 나옵니다. 참값과 다릅니다. 정리의 가정인 "분자와 분모가 모두 0으로 간다"가 성립하지 않으므로 적용 자체가 무효입니다.
(2) 분자 sinx→0이고 분모 x2→0이므로 부정형입니다. 적용해도 됩니다. 한 번 미분하면 2xcosx인데 이제 분자는 1로 가고 분모는 0으로 갑니다. 부정형이 아니므로 여기서 멈춰야 합니다.x→0+에서 +∞, x→0−에서 −∞이므로 양쪽 극한이 다르고 극한은 존재하지 않습니다.
(3) 분자는 1로 가고 분모는 0+으로 갑니다. 부정형이 아니라 0+1 꼴이므로 극한은 +∞입니다. 로피탈을 쓰면 1−sinx→0이라는 완전히 틀린 답이 나옵니다.
이 문제에서 배우는 것: 부정형과 확정형의 구별.
부정형이란 그 꼴만으로는 답이 결정되지 않는 형태를 말합니다. 어떤 것이 부정형이고 어떤 것이 아닌지 정확히 알아야 합니다.
꼴
부정형인가
값
\frac{0}
부정형입니다
무엇이든 될 수 있습니다
\frac{\infty}
부정형입니다
무엇이든 될 수 있습니다
0⋅∞
부정형입니다
무엇이든 될 수 있습니다
∞−∞
부정형입니다
무엇이든 될 수 있습니다
1∞, 00, \infty^
부정형입니다
무엇이든 될 수 있습니다
0+c (c>0)
아닙니다
+∞입니다
\frac{c}
아닙니다
0입니다
0^
아닙니다
0입니다
∞∞, ∞+∞
아닙니다
∞입니다
00이 왜 부정형인지는 간단합니다. x2x→2이고 xx2→0이고 x2x→∞입니다. 같은 00 꼴에서 세 가지 답이 모두 나오므로 꼴만으로는 결정되지 않습니다.
반대로 0+1은 부정형이 아닙니다. 분모가 아주 작은 양수이므로 몫은 반드시 아주 큰 양수이고, 다른 답이 나올 여지가 없습니다.
적용 전 점검표. 로피탈 정리를 쓰기 전에 네 가지를 확인합니다.
항목
확인 내용
1
00 또는 ∞∞ 부정형입니까?
2
f와 g가 a 근처에서 미분가능합니까?
3
a 근처에서 g′=0입니까?
4
g′f′의 극한이 존재합니까?
네 항목 중 어느 하나라도 실패하면 정리를 쓸 수 없습니다. 특히 4번은 문제 4의 주제이며, 놓치기 가장 쉬운 조건입니다.
바로 확인 3.
확인 3-1.x→0limcosxx2+1에 로피탈을 쓰면 안 되는 이유와 참값을 쓰세요.
답. 분자가 1, 분모가 1로 가서 부정형이 아니기 때문입니다. 참값은 그냥 1입니다.
확인 3-2.x→∞limx+1x2+1이 부정형인지 판정하고 값을 구하세요.
답.∞∞ 부정형입니다. 로피탈로 12x→∞이고, 최고차항 비교로도 같은 답을 얻습니다.
확인 3-3.0∞가 부정형이 아닌 이유를 쓰세요.
답. 밑이 0에 가까운 양수이고 지수가 한없이 커지므로 결과는 반드시 0으로 가며, 다른 답이 나올 여지가 없기 때문입니다.
심화 2.x→∞limx2+1x을 로피탈로 계산하면 어떤 일이 일어나는지 확인하고, 올바른 방법으로 값을 구하세요.
풀이.∞∞ 부정형이므로 조건 1은 통과합니다. 미분하면
x2+1x1=xx2+1
입니다. 그런데 이것은 원래 식의 역수입니다. 한 번 더 적용하면 다시 원래 식으로 돌아옵니다. 로피탈을 아무리 반복해도 두 식 사이를 오갈 뿐 값이 나오지 않습니다.
정리 자체가 틀린 것은 아닙니다. 조건은 모두 만족하고 결론도 참입니다. 극한을 L이라 하면 정리가 말해 주는 것은 L=L1이고, 여기서 L2=1이므로 L=±1까지는 알 수 있습니다. 다만 정리가 답을 계산해 주지는 못합니다.
올바른 방법은 최고차항으로 나누는 것입니다. x>0에서
x2+1x=1+1/x21⟶1
입니다. x>0이므로 부호가 양수이고 답은 1입니다.
교훈은 이렇습니다. 로피탈이 적용 가능하다는 것과 유용하다는 것은 다릅니다. 미분해서 더 간단해지지 않으면 다른 방법을 찾아야 합니다.
심화 3.x→∞lim(1+x1)x=e를 로피탈 정리로 증명하세요. 33강에서 e를 이 수열의 극한으로 정의했다는 점을 고려해 무엇을 증명한 것인지 정확히 서술하세요.
풀이.y=(1+x1)x로 두면
lny=xln(1+x1)=1/xln(1+1/x)
입니다. x→∞에서 분자와 분모가 모두 0으로 가므로 00 부정형입니다. 분자를 미분하면 연쇄법칙으로
1+1/x1⋅(−x21)
이고 분모를 미분하면 −x21입니다. 비를 취하면 −x21이 약분되어
1+1/x1⟶1
입니다. 따라서 lny→1이고 exp의 연속성으로 y→e1=e입니다.
무엇을 증명했는지가 중요합니다. 33강에서 e를 수열(1+n1)n의 극한으로 정의했습니다. 여기서 보인 것은 같은 식에서 n을 정수가 아닌 실수x로 바꿔도 극한이 같다는 사실입니다. 수열의 극한이 존재한다고 해서 대응하는 함수의 극한이 자동으로 같은 값을 가지는 것은 아니므로, 이는 새로운 정보입니다.
한편 증명에서 (lnx)′=x1을 썼는데, 39강에서 이 도함수를 유도할 때 e의 정의를 사용했습니다. 그러므로 이 계산은 e의 존재를 증명한 것이 아니라 이미 정의된 e에 대해 함수 버전의 극한도 같음을 보인 것입니다. 이 구분이 심화 4의 주제로 이어집니다.
심화 4.x→0limxsinx=1을 로피탈 정리로 "증명"하는 것이 왜 순환논법인지 설명하세요.
풀이. 흔히 보는 계산은 이렇습니다. 00 부정형이므로 로피탈을 적용해
(x)′(sinx)′=1cosx⟶1
이라고 씁니다. 계산 자체는 틀린 데가 없습니다. 문제는 근거의 순서입니다.
이 계산은 (sinx)′=cosx를 씁니다. 그런데 39강에서 그 도함수를 유도할 때 정의로 돌아가
이 강의에서는 numpy만 씁니다. 극한을 코드로 확인할 때는 x를 0에 가까이 보내며 값을 관찰합니다. 그런데 부정형은 본질적으로 수치적으로 불안정합니다. 분자와 분모가 모두 0에 가까워지면 유효숫자가 급격히 사라지기 때문입니다. 이 강의의 검산은 그 현상 자체를 보여 주는 데 목적이 있습니다.
import numpy as np
# --- 문제 1, 2: 값이 맞는지 -------------------------------------------
h = 1e-4
print(round(float((np.exp(h) - 1)/h), 6)) # 1.00005
print(round(float((h - np.sin(h))/h**3), 6)) # 0.166667
print(round(float((1 - np.cos(h))/h**2), 6)) # 0.5
# --- 부정형은 수치적으로 무너집니다 ------------------------------------
print("x (e^x-1-x)/x^2")
for k in range(2, 10):
x = 10.0**(-k)
print("1e-%d %s" % (k, float((np.exp(x) - 1 - x)/x**2)))
# 1e-2 0.5016708416794892
# 1e-3 0.5001667083845766
# 1e-4 0.5000166714092739
# 1e-5 0.5000006964824075
# 1e-6 0.4999621836984761
# 1e-7 0.49433680305587574
# 1e-8 -0.607747099184471
# 1e-9 82.74037093680877
# --- 문제 3: 부정형이 아닌 곳에 쓰면 틀립니다 --------------------------
x = 1e-9
print(round(float((x + 1)/(x + 2)), 6), 1.0/1.0) # 0.5 1.0
# --- 문제 4: 도함수 비는 진동하고 원래 비는 수렴합니다 -------------------
X = np.linspace(1e3, 1e4, 200001)
ratio = (X + np.sin(X))/X
dratio = 1 + np.cos(X)
print(round(float(ratio.min()), 6), round(float(ratio.max()), 6))
# 0.999004 1.000999
print(round(float(dratio.min()), 4), round(float(dratio.max()), 4))
# 0.0 2.0
# --- 문제 5: 지수 부정형 -----------------------------------------------
x = np.array([1e-2, 1e-4, 1e-6, 1e-8])
print(np.round(x*np.log(x), 6))
# [-4.6052e-02 -9.2100e-04 -1.4000e-05 -0.0000e+00]
print(np.round(x**x, 8))
# [0.95499259 0.99907939 0.99998618 0.99999982]
n = np.array([1e2, 1e4, 1e6, 1e8])
print(np.round((1 + 1/n)**n, 6), round(float(np.e), 6))
# [2.704814 2.718146 2.71828 2.718282] 2.718282
# --- 심화 2: 로피탈이 제자리를 도는 예 ----------------------------------
t = 1e6
print(round(float(t/np.sqrt(t**2 + 1)), 9), round(float(np.sqrt(t**2 + 1)/t), 9))
# 1.0 1.0
# --- 심화 5: 성장 위계 -------------------------------------------------
z = np.array([1e2, 1e4, 1e8, 1e16])
print(np.round(np.log(z)**3/z**0.5, 8))
# [9.76645724e+00 7.81316579e+00 6.25053260e-01 5.00040000e-04]
w = np.array([10.0, 20.0, 50.0, 100.0])
print(w**5/np.exp(w))
# [4.53999298e+00 6.59569159e-03 6.02734327e-14 3.72007598e-34]
# --- 심화 6: 중심차분이 f'' 로 수렴합니다 ------------------------------
f = np.sin
a = 0.7
for hh in [1e-2, 1e-3, 1e-4, 1e-5]:
d2 = (f(a + hh) - 2*f(a) + f(a - hh))/hh**2
print(hh, round(float(d2), 9), round(float(-np.sin(a)), 9))
# 0.01 -0.644212319 -0.644217687
# 0.001 -0.644217634 -0.644217687
# 0.0001 -0.644217679 -0.644217687
# 1e-05 -0.644216902 -0.644217687
실행하면 주석과 같은 값이 나옵니다. 네 곳을 짚어 둡니다.
첫째, x2ex−1−x의 표가 이 강의에서 가장 중요한 출력입니다.x=10−2부터 10−5까지는 0.5에 착실히 다가갑니다. 그런데 10−6부터 자릿수가 흔들리기 시작하더니 10−7에서 0.494로 벌어지고, 10−8에서는 −0.61이라는 음수가 나오며, 10−9에서는 82.7까지 튑니다. 참값 0.5와 아무 관계가 없는 숫자입니다.
이유를 정확히 따져 볼 수 있습니다. x=10−8일 때 ex−1−x의 참값은 대략 2x2=5×10−17입니다. 그런데 ex를 계산하면 값이 1 근처이고, 배정밀도에서 1 근처 수의 표현 간격은 약 2.2×10−16입니다. 구하려는 신호가 표현 간격보다 작으므로 뺄셈 결과는 신호가 아니라 반올림 잡음입니다. 그 잡음을 x2=10−16으로 나누니 O(1) 크기의 아무 값이나 나옵니다. x=10−9에서는 x2=10−18로 더 작아져 같은 잡음이 100배로 증폭되고, 실제로 82.7이 나옵니다.
여기서 얻는 결론은 분명합니다. 수치 계산으로 극한에 다가갈 때 무작정 가깝게 가면 오히려 답이 무너집니다. 정확도가 가장 좋은 지점이 중간 어딘가에 있고, 그 지점을 지나면 다시 나빠집니다. 로피탈은 이 문제를 겪지 않습니다. 미분을 먼저 해서 부정형을 없앤 뒤에 대입하기 때문입니다. 해석적 방법이 수치적 방법보다 나은 자리가 정확히 이런 곳입니다.
같은 이유로 첫 블록의 heh−1가 h=10−4에서 1이 아니라 1.00005로 나옵니다. 이쪽은 잡음이 아니라 참값 자체가 아직 1이 아니기 때문입니다. 다음 항이 2h=5×10−5이므로 정확히 그만큼 크게 나옵니다. 두 현상을 구별하십시오. 하나는 극한에 아직 도달하지 못한 것이고 다른 하나는 계산이 무너진 것입니다.
둘째, 문제 4의 반례가 숫자로 확인됩니다. 원래 비는 0.9999와 1.0001 사이에 갇혀 있어 1로 수렴하는 것이 보이는데, 도함수 비는 0과 2 사이를 끝까지 오갑니다. 원래 극한은 존재하고 도함수 비의 극한은 존재하지 않는다는 상황이 실제로 일어납니다.
셋째, 심화 2에서 원래 식과 그 역수가 둘 다 1로 나옵니다. L=L1이 성립하는 것이 눈에 보이며, 로피탈이 제자리를 도는 이유가 여기 있습니다.
넷째, 심화 5의 성장 위계가 얼마나 늦게 드러나는지를 봐 두십시오. z(lnz)3은 0으로 가야 하는데 z=100에서 9.77이고 z=104에서도 아직 7.81입니다. z=108에서 겨우 0.625로 1 아래에 내려오고, z=1016에 가서야 5×10−4가 됩니다. 지수를 3으로 올린 로그가 제곱근을 이기는 구간이 이렇게 길다는 뜻입니다.
eww5는 훨씬 빠릅니다. w=10에서 4.54이던 것이 w=20에서 이미 6.6×10−3으로 떨어지고 w=100에서는 10−34입니다. 지수함수가 거듭제곱을 압도하는 속도와 거듭제곱이 로그를 압도하는 속도는 규모가 전혀 다릅니다. 위계가 성립한다는 사실과 그것이 실제 계산에서 언제부터 눈에 보이는가는 별개의 문제이며, 알고리즘의 계산량을 비교할 때 이 구분이 실무적으로 중요해집니다.