[선형 대수] 코딩으로 선형 방정식 풀기 (MATLABver., Pythonver.)

이번 포스팅에서는 MATLAB와 python으로 선형 방정식을 푸는 방법을 예를 통해 알려드리겠습니다. Ax=b형을 풀게 되는데, 이는 [A|b] 행렬이며, 지난 포스팅에서 언급한 방정식을 행렬화하는 조건에서 설명한 형태를 의미합니다.

들어가기 전에… 먼저 선형 방정식을 푸는 방법을 소개했어요. 그런데 사실 이 방법은 단적으로 계산놀이가 심해서 코딩을 할 수 있다면 프로그래밍화해서 충분히 컴퓨터에 풀게 하면 됩니다. 그럼 이것은 컴퓨터에 맡기면 되기 때문에 굳이 배우지 않아도 되는 것일까요?

저는 아닌 것 같아요. 수작업으로 푸는 방법을 알고 연습해 보는 것은 여전히 도움이 됩니다. 크게 보면 선형 대수 독자적인 공부 관점과 모델링 및 분석 관점, 그리고 (노골적이지만) 수업 과제의 정답 확인 관점에서 필요성이 있습니다.

선형 대수 공부 관점-선형 방정식을 행렬화하고 가우스 소거법을 익혀 두는 것은 매우 도움이 됩니다. 이 과정이 rank를 이해하는 데도 행렬식을 계산하는 방법에도 도움이 됩니다. 그리고 추상적인 관점에서는 span, basis 등의 개념을 익힐 때나 선형 변환을 공부할 때도 선형 방정식은 또 나옵니다.모델링 및 분석 관점 – 물론 실제로 모두가 MATLAB의 linsolve 또는 python의 numpy.linalg.solve를 사용하고 있다는 것은 알고 있습니다. 그러나 덧셈, 제곱근, 코사인 등을 이해해야 계산식을 세우고 공학용 계산기로 계산할 수 있듯이 문제 모델링, 입력 데이터 작성법과 결과값을 해석하는 방법 등을 이해하기 위해서는 기초적인 수작업 계산이 어떻게 돌아가는지 알아야 합니다.숙제 정답 확인 관점-문제 해결 관점 또한 답이 유일하지 않거나 답이 정해지지 않은 경우, 답이 분수형인 경우나 제곱근이 들어가는 경우 등에 대해서는 출력값을 봐도 이게 제대로 된 것인지 파악이 쉽지 않습니다.(사실 이 부분 검증하는 요령도 알려드리지만 여전히 제출하려면 공부를 해야 합니다.) 따라서 상황에 따라 적절한 푸는 방법을 알아야 숙제의 답을 제대로 쓸 수 있습니다. 특히 제곱근과 분수가 들어가면 소수점으로 제출하면 틀린 거죠?

MATLAB에서푸는선형방정식먼저MATLAB입니다.방법은크게linsolve와mdivide두가지가있습니다.1. linsolve의 다음 연립 방정식을 표현한다고 칩시다.이를 MATLAB로 표현하면 다음과 같습니다.이는 연립방정식을 행렬형으로 표현하고 계수행렬 A와 정수치 b를 따로 정의하고 결과값을 [x, y, z] 형태로 return하는 형태입니다.답이 맞는지 검증하는 방법은 다음과 같습니다.

이 의미는 x=0, y=0.1776*10^(-14), z=0.1332*10^(-14)라는 뜻입니다. 컴퓨터 부동소수점 연산의 한계로 인해 정확한 0은 아니지만, 이 정도면 대부분 정답이라고 생각하셔도 됩니다. (가끔 이 오차에 근접해서 오차를 무시할 수 없는 문제가 있을 수 있지만, 그런 것은 사실 컴퓨터에 맡기 전에 계수 크기를 키우는 것이 바람직합니다.)

두 번째 방식은 mdivide(matrix divide)라는 방식으로 간단히 말하면 b/A를 계산한다는 같은 개념입니다. 이건 더 쉬워요.

저(원화)는 영미권에서는 に이 됩니다. 즉, b나눔 A의 개념이라고 할 수 있습니다. 사실 줄 파트를 쓰지 않아서 정확한 설명은 어렵지만 그래도 검산할 때 편리합니다.

파이썬으로 푸는 선형 방정식 다음은 파이썬입니다. 이것은 머신러닝 툴킷 scipy와 국민 수식 툴킷 numpy를 모두 제공합니다. 먼저 numpy와 ndarray 기준으로 설명하겠습니다.음영처리된 vscode에서 그대로 복사한거라 조금 어두워요.

이번에도 역시 MATLAB와 같은 선형 방정식 도장을 파이선으로 푸는 코드는 다음과 같습니다.

이렇게 됩니다. 여기서 주의해야 할 점이며 특이한 점은 b=np.array([1, -2,1])라고 해도 허용됩니다.

이건 좀 주의하세요, b에 괄호 하나 썼으니까 가능해요. 괄호가 하나면 numpy 쪽에서 가로나 세로를 유연하게 판단해서 이야기가 될 수 있도록 전치를 스스로 판단해 줍니다. 만약 대괄호 두 개를 쓰면 엄격한 행렬로 간주되고, 그럴 때는 오류가 납니다.

error: Content is protected !!