주메뉴바로가기.. 본문바로가기

Junior Polymath

주니어 폴리매스 문제 보기

문제

[코딩 수학] 코딩으로 '연립방정식' 정복하기

2019.02.01

같이 풀어볼까?

네이버밴드 구글플러스

미지수가 2개 이상인 방정식, 연립방정식



안녕하세요, '코딩 수학' 연재를 맡은 이재윤 연구원입니다! 벌써 코딩 수학 두 번째 시간이네요. 다들 코딩을 이용해 수학 문제를 효율적으로 풀고 계신가요? 간단한 수학 문제는 손으로도 풀고 코딩으로도 풀 수 있지만, 실생활 문제나 어렵고 복잡한 함수를 다루려면 손으로 풀기 어려운 경우가 많아요. 코딩을 활용하면 언제나 해결할 수 있으니 열심히 익히고 활용해 보자고요.

코딩 명령어를 익힌 뒤엔 해당 코딩 명령어로 풀 수 있는 수학 문제를 찾아 댓글로 달고 친구들과 토론해 보세요. 가장 좋은 문제를 올려준 친구를 MVP로 선정해 폴리매스 기사에 소개하도록 할게요.smiley



1차 연립방정식과 행렬

이번에 코딩으로 정복할 수학 개념은 바로 '1차 연립방정식'입니다. 1차 연립방정식은 미지수가 2개 이상인 1차 방정식의 모임을 뜻해요. x-1=2처럼 미지수가 하나인 1차 방정식은 아래처럼 등호의 좌‧우변에 같은 수를 더하거나 빼거나 곱해도 되는 '등식의 성질'을 이용해 해를 쉽게 구할 수 있지만, 연립방정식은 '소거법'이라는 복잡한 방법을 이용해야 해를 구할 수 있어요.

\LARGE x-1=2 \rightarrow x-1+1=2+1 \rightarrow x=3

소거법이라고 만능은 아닙니다. 미지수가 무척 많은 연립방정식은 소거법을 이용해도 시간이 무척 오래 걸리기 때문이지요. 그래서 수학에서는 ‘행렬’이라는 수학 개념을 이용해 연립방정식을 풉니다. 행렬은 수를 행과 열에 맞춰 나열해 놓은 것으로 특히 행 또는 열 1개로 이뤄진 행렬을 ‘벡터’라고 부릅니다. 1차 연립방정식에 포함된 2개 이상의 방정식은 모두 같은 미지수를 가졌기 때문에 사실 해를 결정하는 건 미지수에 곱해져 있는 수인 ‘계수’와 등호 오른쪽에 숫자로만 이뤄진 ‘상수’입니다. 독일 수학자 칼 프리드리히 가우스는 연립방정식의 계수를 모아 ‘계수 행렬’을 만들고 상수를 모아 ‘상수 벡터’로 만든 뒤, 직접 만든 행렬 전용 소거법인 '가우스 소거법'을 이용해 연립방정식의 해를 구하는 과정을 보다 단순하게 만들었죠. 놀라운 사실은 동양에서 가우스 보다 먼저 가우스와 똑같은 방법으로 연립방정식을 풀었다는 건데요. 연립방정식과 관련된 문헌 중 가장 오래된 ‘구장산술’(1~2세기 한 왕조) 제8장 ‘방정’에서는 여러 연립방정식 문제를 가우스의 방법으로 푼 기록이 있습니다. ‘방정식’이라는 말이 바로 구장산술에서 계수와 상수를 줄맞춰 늘어놓은 것을 ‘방정’이라고 부른 데서 유래한 거지요. 등식의 양쪽에 같은 수를 더하거나 빼는 것처럼 계수 행렬이 단위행렬과 비슷해질 때까지 계수 행렬과 상수 벡터에 ‘기본 행 연산’이라는 연산을 적용하면 어느새 상수 벡터가 연립방정식의 해로 바뀌어 있습니다. 소거법보다 간단하지만, 가우스 소거법도 미지수가 많은 연립방정식일수록 복잡한 과정을 거쳐야 하는 건 마찬가지입니다. 일일이 손으로 풀려면 무척 골치 아프겠죠? 연립방정식을 푸는 코딩 명령어를 이용하면 계수 행렬과 상수 벡터를 입력하는 것만으로도 곧바로 해를 구할 수 있습니다. 자, 그럼 구장산술에 수록된 미지수가 3개인 연립방정식을 직접 풀어본 뒤 코딩 명령어로 해를 찾아보도록 하죠!

‘구장산술’에 있는 연립방정식 풀어보기

“소 2마리와 양 5마리를 팔아 돼지 13마리를 사면 1000전이 남고, 소 3마리와 돼지 3마리를 팔아 양 9마리를 사면 돈이 남지 않으며 양 6마리와 돼지 8마리를 팔아 소 5마리를 사면 600전이 모자란다. 소, 양, 돼지는 각각 얼마인가.”


<직 접 풀 어 보 기>

Step1. 소, 양, 돼지의 가격을 각각 미지수 x, y, z로 놓고 연립방정식을 만든다.

①소 2마리와 양 5마리를 팔아서 돼지 13마리를 사면 1000전이 남고

\large 2x+5y-13z=1000

②소 3마리와 돼지 3마리를 팔아서 양 9마리를 사면 돈이 남지 않으며

\large 3x-9y+3z=0

③양 6마리와 돼지 8마리를 팔아서 소 5마리를 사면 600전이 모자란다

\large -5x+6y+3z=-600


Step2. 소거법을 이용해 미지수 2개로 이뤄진 방정식을 만든다.

②의 식을 x에 관해 정리한 뒤 ①번 식에 대입하면

\large 2(3y-z)+5y-13z=1000

\large 11y-15z=1000

다시 ②의 식을 x에 관해 정리한 뒤 ③번 식에 대입하면

\large -5(3y-z)+6y+8z=-600

\large -9y+13z=-600


Step3. 미지수의 값을 구한다.

Step2에서 얻은 식에서 소거법으로 y를 제거하고 계산하면 z=300이다.

이 값을 Step2의 식 중 하나에 대입하면 y=500이다.

두 값을 Step1의 식에 대입하면 x=1200이다.



<코 딩 으 로 풀 어 보 기>

연립방정식을 푸는 코딩 명령어는 아래와 같아요.


①구장산술에 나온 문제를 미지수 x, y, z를 이용해 연립방정식으로 나타낸 뒤 보기 좋게 나란히 써보세요. 연립방정식을 계수 행렬과 미지수, 상수 행렬로 구분해 표현한 것을 '연립방정식의 행렬꼴'이라고 부릅니다.


\large \begin{cases} 2x+5y-13z=1000 & \\ 3x-9y+3z=0 & \\ -5x+6y+8z=-600 & \end{cases}\Rightarrow \begin{vmatrix} 2 & 5 & -3\\ 3 & -9 & 3\\ -5 & 6 & 8 \end{vmatrix}\begin{vmatrix} x\\ y \\ z \end{vmatrix}=\begin{vmatrix} 1000\\0 \\ -600 \end{vmatrix}

\large 계수 행렬 A= \begin{vmatrix} 2 & 5 & -3\\ 3 & -9 & 3\\ -5 & 6 & 8 \end{vmatrix} 상수 벡터 b= \begin{vmatrix} 1000\\0 \\ -600 \end{vmatrix}\large A=\begin{vmatrix} 2 & 5 & -3\\ 3 & -9 & 3\\ -5 & 6 & 8 \end{vmatrix} , \large b= \begin{vmatrix} 1000\\0 \\ -600 \end{vmatrix}}

②각 행에 있는 계수로 행렬을 만들고, 상수항은 행 1개로 이뤄진 행렬인 ‘벡터’로 지정한 뒤 연립방정식의 해를 구하는 명령어를 입력해 보세요. Evaluate 버튼을 누르면 x, y, z값이 순서대로 나옵니다.





③아래 명령어를 입력하면 '가우스 소거법'으로 연립방정식의 해를 구하는 과정을 좀더 자세히 볼 수 있어요. 아래 코드에서 “첨가행렬 [A: b]의 RREF”는 앞서 소거법과 같은 원리로 행렬꼴의 연립방정식을 간단하게 만들어 줍니다.




기원전 4세기경 바빌로니아인이 점토판에 연립방정식 문제를 살펴보자. 총 면적이 1800평방야드인 두 들판이 있다. 한 들판에서는 1평방야드당 5.3부셸(bushel)의 비율로 곡물이 생산되고 다른 들판에서는 4부셸(bushel)의 비율로 곡물이 생산된다. 곡물의 전체 생산량이 8800부셸(bushel)이라면 각 들판의 면적은 몇 평방야드일까?

출처: 대한수학회 뉴스레터 V. 55, pp. 20-27 (1997 9월) -S.G. Lee and O.K. Kang

★1부셸은 약 35.24L(리터).


댓글 7

  • 김우현 기자 2019.02.01 19:11:59

    Mission 문제는 주말에 업로드 할 예정입니다!

    좋아요0 댓글수0
  • 김우현 기자 2019.02.01 19:12:31

    ③번 코딩창에서 값이 출력되지 않는다면 &quot;"로 바꾼 뒤 Evaluate 버튼을 눌러보세요! 

    (코딩창에 있는 &quot;는 총 4개입니다!)

    좋아요0 댓글수1
    • 김우현 기자 2019.02.12 09:53:02

      수정 완료!surprise

      좋아요1
  • 인천 오일러 2019.02.11 20:52:00

     주어진 조건을 수식으로 표현하면 x+y=1800, 5.3x+4y=8800 입니다.

    A = matrix([[1, 1], [5.3, 4]])
    b = vector([1800, 8800])
    print A.solve_right(b)

    로 계산하면 답은  

    (1230.76923076923, 569.230769230769)

    로 나오네요.

    좋아요0 댓글수0
  • 인천 오일러 2019.02.20 21:21:40

    원유를 분별 증류하면 휘발유, 등유 등 다양한 제품을 얻을 수 있습니다.  이중 휘발유가 원유 1L에서 얻어지는 양당 1200원, 등유는 1300원, 경유는 3000원이라고 합시다. 원유 5510L를 분별 증류 시켰을 때 10L는 손실되고, 나머지는 전부 휘발유,경유,등유 중 하나가 되었습니다. 이 기름들은 전부 팔아 12130000 원을 얻었고, 경유로 얻은 수익이 다른 두 기름으로 얻은 수익의 합의 \frac{900}{313}배와 같을 때, 각각의 기름들은 원유 몇 L에서 얻었을까요?

    좋아요0 댓글수1
    • 인천 오일러 2019.03.01 18:11:39

       김태이님,  중간에 계산을 잘못하셨습니다. 그리고 제가 질문한 것은 각각의 기름은 원유 몇L에서 얻어졌는지입니다.

      좋아요0
  • 김태이 2019.03.01 00:06:53

    x+y=1800

    53x+40y=88000

    53x+53y=1800*53=95400

    13y=95400-88000=7400

    y=7400/13

    x=16000/13

    답은 각각 16000/13 ,7400/13 평방야드입니다.

    좋아요0 댓글수0