문서 소목차
소목차
Welcome to Mathit!
M
Everywhere Mathit!
웹 플레이그라운드
CLI 설치
창의적으로 생각해요
기하학적 사고
알고리즘 퍼즐
수학적 모델링
논리 패러독스
패턴 탐색
모르겠으면 모두와 함께
euler_fan · 5분 전
Mathit 수식 엔진에서 다변수 미분 최적화할 때 어떤 옵션을 주나요?
matrix_dev · 32분 전
LaTeX 기반 표기법과 Mathit DSL 간 변환 벤치마크 공유합니다.
오픈되지 않았어요
AI에게 물어봐도 좋아요
보내기

역기하 제약 해결사

고급 엔진 / 역기하 제약 해결사

7.1 역기하 제약 해결사

일반적인 작도는 점의 좌표를 먼저 정하고 그로부터 길이와 각도를 도출하는 순방향 방식으로 이루어집니다. 그러나 실제 기출문항은 "두 변의 길이가 각각 5와 7이고 사이 각이 30도이며, 한 꼭짓점이 특정 포물선 위에 있는 삼각형"처럼 결과적인 기하 조건만 주어지는 경우가 많습니다.

이러한 문제를 손으로 연립방정식을 세워 좌표를 구하는 대신, 수치 해석 엔진에 조건을 그대로 넘겨 미지수를 역으로 찾아내게 하는 문법이 solve 블록입니다.

미지수 리터럴

Mathit에서는 값을 알 수 없는 수치나 좌표 성분에 물음표 기호 ?를 부여합니다.

점의 가로 좌표와 세로 좌표를 모두 모른다면 C = (?, ?) 형태로 선언합니다.

만약 점이 가로축 위에 있다는 사실을 알고 있다면 세로 좌표를 0으로 고정하여 B = (?, 0)과 같이 부분 미지수로 선언합니다.

스칼라 길이 값 자체를 모를 때도 len = ? 형태로 미지수를 선언할 수 있습니다.

제약 조건 기술 문법

solve 블록 내부에는 대상이 되는 점들을 미지수로 배치하고, 그 아래에 만족해야 하는 기하학적 등식들을 나열합니다. 모든 조건식에는 반드시 동등 비교 연산자인 이중 등호 ==를 사용해야 합니다.

복사
solve {
    A = (0, 0)
    B = (?, 0)
    C = (?, ?)
    
    dist(A, B) == 5
    dist(B, C) == 7
    ang(C, A, B) == 30deg
    C.y == C.x^2 - 2
}

poly: A--B--C, stroke=1.5pt

위 코드에서 점 A는 원점에 고정되어 있고, 점 B는 가로축 위의 미지점, 점 C는 평면 위의 미지점입니다.

부여된 제약 조건은 네 가지입니다.

1. 점 A와 B 사이의 거리가 5입니다.

2. 점 B와 C 사이의 거리가 7입니다.

3. 세 점이 이루는 각 CAB의 크기가 30도입니다.

4. 점 C의 세로 좌표(C.y)가 점 C의 가로 좌표(C.x)로 표현되는 이차곡선 y=x2−2y = x^2 - 2 위에 존재합니다.

solve 블록이 실행된 직후부터 점 B와 C는 일반 좌표점과 완전히 동일하게 poly:, line:, ang: 등의 지시어에서 활용됩니다.

수렴 실패와 디버깅 요령

제약 해결사가 올바른 해를 찾지 못하고 에러를 출력할 때는 대수학적 자유도를 점검해야 합니다.

첫째, 조건 부족 상태입니다.

찾아야 하는 미지수의 개수보다 부여된 독립 방정식의 개수가 적으면 해가 무수히 많이 존재하므로 점의 위치를 특정할 수 없습니다. 미지 성분이 총 세 개라면 서로 독립적인 기하 조건식도 최소 세 개 이상 주어져야 합니다.

둘째, 모순된 제약 상태입니다.

삼각형의 세 변의 길이를 각각 2, 3, 10으로 부여하는 것처럼 기하학적으로 불가능한 조건을 주면 해가 존재하지 않아 수렴에 실패합니다.

셋째, 다중 해 문제와 초기 추정값 지정입니다.

원과 직선의 교점 조건처럼 해가 두 개 이상 존재하는 경우, 사용자가 의도하지 않은 반대편 사분면의 해로 수렴할 수 있습니다. 이때는 미지수에 근사 힌트를 부여하여 원하는 방향의 해를 선택하도록 유도합니다.

복사
C = (? near 2, ? near 3)

위와 같이 near 키워드를 함께 적어주면 원하는 위치의 해를 잡아냅니다.

취소