[직교하는 도로에서 공장 배치의 최적화] 그림과 같이 서로 직교하는 직선 도로에서 각각 떨어진 지점에 회사가 있고, 회사에서 떨어진 도로 위에 공장이 있다. 회사는 두 공장 를 차례로 거친 후 다시 회사로 돌아오는 거리가 최소가 되도록 공장을 도로 위에 세웠다. 이때 두 공장 사이의 거리를 구하시오. (단, 두 공장 는 서로 다른 도로 위에 있다.)
[ 해설 ]: 두 직교하는 도로를 축과 축이라 하면 회사의 좌표는 이다. 공장은 회사에서 떨어진 도로 위에 있으므로 의 좌표는 이다. 축에 대하여 대칭한 점을 이라 하면 의 좌표는 이다.
이므로 의 최솟값은
의 최솟값과 같다. 의 길이는 정해져 있으므로 가 최소일 때 전체 길이가 최소가 된다. 그림과 같이 을 잇는 선분이 축과 만나는 점에 가 위치할 때 의 길이가 최소이다.
이므로 의 길이는
  1. symPy: 직선의 방정식을 위한 변수 지정
    x = sympy.Symbol('x')

  2. 랜덤변수 지정
  • 회사의 위치
  • 회사와 공장의 거리
# A회사의 위치
pool = [ [3, 4], [4, 3], [6, 8], [8, 6] ]
a1, a2 = random.choice(pool)
A = (a1, a2)
A1 = (a1, -a2)

# A회사와 B공장의 거리
AB = sympy.sqrt(a1**2 + (a2-b1)**2)
  1. 지정한 변수명으로 변경
  • #{ 변수명 }# 형태로 입력한다.
  • 수식모드의 경우 $#{ 변수명 }#$
[문제(TeX)]
그림과 같이 서로 직교하는 직선 도로에서 각각 {a1} km, {a2} km 떨어진 지점에 A 회사가 있고, 
A 회사에서 {AB} km 떨어진 도로 위에 B 공장이 있다. 
A 회사는 두 공장 B, C를 차례로 거친 후 다시 A 회사로 돌아오는 거리가 최소가 되도록 C 공장을 도로 위에 세웠다. 
이때 두 공장 B, C 사이의 거리를 구하시오. (단, 두 공장 B, C 는 서로 다른 도로 위에 있다.)
  • Tip
    • tex.point()
    • overline{}
[해설(TeX)]
두 직교하는 도로를 $x$축과 $y$축이라 하면 A 회사의 좌표는 {tex.point(A)}이다.
B 공장은 A 회사에서 {AB} km 떨어진 도로 위에 있으므로 
B 의 좌표는 {tex.point(B)}이다. $\text{A}$를 $x$축에 대하여 
대칭한 점을 A'이라 하면 A'의 좌표는 {tex.point(A1)} 이다.
$\overline{CA} = \overline{CA'}$ 이므로 
$\overline{AB} + \overline{BC} + \overline{CA}$의 최솟값은
$\overline{AB} + \overline{BC} + \overline{CA'}$ 의 최솟값과 같다. 
$\overline{AB}$의 길이는 정해져 있으므로 $\overline{BC} + \overline{CA}$가 최소일 때 
전체 길이가 최소가 된다. 
그림과 같이 B와 A'을 잇는 선분이 $x$ 축과 만나는 점에 C가 위치할 때 
$\overline{BC} + \overline{CA'}$ 의 길이가 최소이다.
$\overline{BA'} = \sqrt{a1}^2 + {b1+a2}^2 = {A1B}$
이므로 $\overline{BC}$의 길이는
${A1B} \times \frac{b1}{b1+a2} = {ans}$
  1. 데이터 캔버스: 그림 그리기
  • 도형 선택 > 점: 좌표: A; 텍스트: $\rm A$
  • 도형 선택 > 선: 좌표 리스트: A, B, C; 닫힌 선
  • 도형 선택 > 표시 - 각도: 각을 이루는 세 점: A, [0, A[1]], [0, 20]; 호의 폭: 0.8; 호의 높이: 0.8
  • 도형 선택 > 표시 - 길이: 선분을 이루는 두 점: A, [A[0], 0]; 텍스트: f"${a2} \rm km$"
  • 각도와 길이를 추가: [복제] 클릭하여 편집
  • 문제에 붙여넣기

 코드 예시
[직교하는 도로에서 공장 배치의 최적화] 템플릿 바로가기
x = sympy.symbols('x')

# A 회사의 위치
pool = [ [3, 4], [4, 3], [6, 8], [8, 6] ]
a1, a2 = random.choice(pool)
A = (a1, a2)
A1 = (a1, -a2)

b1 = cm.rn(1, a2-1)
B = (0, b1)

# A'B 직선
m1 = -sympy.Rational(b1+a2, a1)
e1 = m1*x + b1

c1 = -b1/m1
C = (c1, 0)

AB = sympy.sqrt(a1**2 + (a2-b1)**2)
A1B = sympy.sqrt(a1**2 + (b1+a2)**2)

ans = A1B * sympy.Rational(b1, b1+a2)

rg = max(a1, a2)
cv1 = graphs.DataCanvas.canvas_by_name('cv1')
cv2 = graphs.DataCanvas.canvas_by_name('cv2')