2차원 함수 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""2차원 함수 검증.
문서: 27.2차원 함수 (정의, 두 변수의 관계, 자주 하는 오해, 카드 C2·C3)
주장:
1. 2차원 사각 함수는 분리된다: rect(x/a, y/b) = rect(x/a) rect(y/b).
경계값까지: |x| = a/2, |y| < b/2이면 1/2, 모서리 |x| = a/2, |y| = b/2이면 1/4.
2. 원판 함수는 x와 y로 분리되지 않는다(반지름 1에서 (0.8, 0.8)이 반례).
극좌표로는 r 하나만의 함수다.
3. 극좌표 θ = arctan(y/x)는 (1, 1)과 (-1, -1)을 같은 각으로 보낸다. 사분면까지 가리려면 atan2를 쓴다.
4. 상관이 0이어도 독립이 아니다: X가 -1, 0, 1을 같은 확률로 갖고 Y = X²이면 공분산 0이지만
Y는 X로 완전히 정해진다.
5. 내적이 0인 두 벡터(직교)의 예: (1, 2)와 (2, -1).
"""
import math
from fractions import Fraction as Fr
def rect1(u):
au = abs(u)
return 1.0 if au < 0.5 else (0.5 if au == 0.5 else 0.0)
def rect2(x, y, a, b):
ax, ay = abs(x) / a, abs(y) / b
if ax < 0.5 and ay < 0.5:
return 1.0
if ax > 0.5 or ay > 0.5:
return 0.0
if ax == 0.5 and ay == 0.5:
return 0.25
return 0.5
def disk(x, y, R=1.0):
return 1.0 if math.hypot(x, y) <= R else 0.0
def main() -> None:
a, b = 2.0, 4.0
pts = [(-1.5, 0), (0, 0), (0.9, 1.9), (1.0, 0.5), (0.5, 2.0), (1.0, 2.0), (1.1, 0), (0, 2.1)]
for x, y in pts:
assert rect2(x, y, a, b) == rect1(x / a) * rect1(y / b)
assert rect2(1.0, 0.0, a, b) == 0.5 and rect2(1.0, 2.0, a, b) == 0.25
# 2. 원판은 분리 불가: 분리된다면 f(.8,.8) = f(.8,0) f(0,.8) / f(0,0) = 1
f = disk
assert f(0.8, 0) == 1 and f(0, 0.8) == 1 and f(0, 0) == 1
assert f(0.8, 0) * f(0, 0.8) / f(0, 0) == 1 and f(0.8, 0.8) == 0
for th in [0.0, 1.0, 2.5]:
r = 0.9
assert f(r * math.cos(th), r * math.sin(th)) == 1
# 3. arctan과 atan2
assert math.atan(1 / 1) == math.atan(-1 / -1)
assert abs(math.atan2(1, 1) - math.pi / 4) < 1e-12 and abs(math.atan2(-1, -1) + 3 * math.pi / 4) < 1e-12
# 4. 상관 0이지만 종속
xs = [-1, 0, 1]
ex = Fr(sum(xs), 3)
ey = Fr(sum(v * v for v in xs), 3)
exy = Fr(sum(v * v * v for v in xs), 3)
assert exy - ex * ey == 0
assert Fr(1, 3) != Fr(1, 3) * Fr(1, 3) # P(X=0, Y=0) = 1/3 ≠ P(X=0) P(Y=0) = 1/9 → 종속
# 5. 직교
assert 1 * 2 + 2 * (-1) == 0
print("ALL CHECKS PASSED")
if __name__ == "__main__":
main()