Skip to content

Commit da0adf1

Browse files
committed
gauss elimination : end
1 parent faa9454 commit da0adf1

File tree

1 file changed

+75
-1
lines changed

1 file changed

+75
-1
lines changed

_posts/2025-08-02-gauss_elimination.md

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -590,4 +590,78 @@ $$
590590
따라서, $A$는 4차원 공간 상에서 $\left(\frac45,-\frac{22}3,0,0\right)$를 지나고 두 벡터 $\left(1,22,10,0\right)$, $\left(-1,7,0,5\right)$를 basis로 하는 평면이다.
591591

592592

593-
# 3. code implementation
593+
# 3. code implementation
594+
595+
가우스 소거법의 목적은 연립방정식을 푸는 데 있다.
596+
그래서 그런지 `numpy``scipy`에서 가우스 소거법을 말그대로 실행하는 코드는 찾지 못했다.
597+
연립방정식을 '푸는' 메소드 `numpy.linalg.solve(a,b)`는 있어도 가우스 소거법의 각 과정을 학습 목적상으로 구현해주는 코드는 없어 보이는 것이다.
598+
그러니까, 어떤 연립방정식이 주어졌을 때 그 연립방정식에 대해 가우스 소거법을 적용한 결과인 augmented matrix 형태를 얻을 수 있다면 참 좋겠는데, 그런 것을 제공하는 라이브러리는 못찾겠다.
599+
아마도 `numpy.linalg.solve` 내에 가우스 소거법이 들어가있겠지만, trivial한 경우 (해집합이 공집합이거나 무한집합인 경우)에 대해서는 오류를 낼 뿐이지 affine space의 단초가 되는 augmented matrix를 결과로 도출하지는 않는 것이다.
600+
601+
물론, 그렇게 어려운 알고리즘이 아니니 직접 구현할 수도 있을 것이다.
602+
[`geeksforgeeks`](https://www.geeksforgeeks.org/dsa/gaussian-elimination/)에 보니 가우스 소거법 코드가 있다.
603+
이걸 적절히 변형하면 결과로 나오는 augmented matrix를 얻는 코드드 얻어낼 수도 있겠다.
604+
605+
```
606+
N = 3
607+
def gaussianElimination(mat):
608+
for k in range(N):
609+
i_max = max(range(k, N), key=lambda i: abs(mat[i][k]))
610+
if mat[i_max][k] == 0:
611+
print("Singular Matrix.")
612+
print("Inconsistent System." if mat[i_max][N]
613+
else "May have infinitely many solutions.")
614+
return
615+
mat[k], mat[i_max] = mat[i_max], mat[k]
616+
617+
for i in range(k + 1, N):
618+
f = mat[i][k] / mat[k][k]
619+
mat[i][k + 1:] = [mat[i][j] - f * mat[k][j]
620+
for j in range(k + 1, N + 1)]
621+
mat[i][k] = 0
622+
623+
x = [0] * N
624+
for i in range(N - 1, -1, -1):
625+
x[i] = (mat[i][N] - sum(mat[i][j] * x[j]
626+
for j in range(i + 1, N))) / mat[i][i]
627+
628+
print("\nSolution for the system:")
629+
for xi in x:
630+
print(f"{xi:.8f}")
631+
632+
mat = [[3.0, 2.0, -4.0, 3.0], [2.0, 3.0, 3.0, 15.0], [5.0, -3.0, 1.0, 14.0]]
633+
gaussianElimination(mat)
634+
```
635+
636+
다른 곳에도 이와 비슷한 코드들이 있는 것으로 보인다.
637+
638+
# 4.
639+
640+
무언가 스트레스를 받거나 일신상의 변화가 생기면, 이런 식으로 수학 글을 쓰고 싶어진다.
641+
이런 걸 순수수학이라고 해야할까, 응용수학이라고 해야 할까.
642+
순수수학이라고 하기엔 너무 기초적인 수학이고 응용수학이라고 하기엔 나는 성향상 코드 implementation이나 활용방안에 대해 관심이 있기 보다는 해당 주제의 수학적인 원리나 증명을 자세히 수행하기를 더 선호하는 것이다.
643+
결국 돈을 벌거나 '실제로 유용한' 무언가를 해낸다기 보다는 잘 알려져 있는 사실을 잘 정리하여 만족스러운 정도로 서술하는 것에서 만족감을 느낄 뿐이다.
644+
645+
새로 시작하게 된 업무를 위해서는 DDPG를 공부해야 할 필요가 있다.
646+
어제 세미나에서 보게 된 DQN은 재미있었다.
647+
대학원에서 나는 DQN을 구현해내지 못해 사람들 앞에서 망신을 당했었다.
648+
그런데 다시 DQN의 원리를 보니 그렇게까지 어려울 것이 아니라는 생각이 문득 든다.
649+
발표해주신 분들과 커멘트를 해주신 교수님 덕이겠지만, 대학원 때는 왜 이것이 그렇게 어려웠을까 싶다.
650+
651+
어쩌면 지도교수님의, 수학과 특유의 성향, 그러니까 위에 언급한 내가 보이는 것과 같은 성향 때문에, DRN(deep reinforcement learning)을 너무 진지하게 이해하려 했던 것이 내 머리를 경직시킨 것은 아니었을까.
652+
그때 공부했던 것이 있기에 지금 잘 이해가 되는 것이기도 하지만, 당시의 나는 머리가 움직이지 않았다.
653+
그만큼 대학원에서의 시기는 힘들었다.
654+
교수님이 얼마나 괜찮았건, 혹은 날 배려해주셨건 상관 없이 머릿속이 늘 복잡했고 압박을 받는 심리상태가 있었다.
655+
656+
DDPG를 공부해야 한다면, 나는 공부할 수 있을 수도 있다.
657+
말하자면, 내 이해력은 그래도 충분할 지도 모르는 것이다.
658+
하지만 실제로 내가 그것을 해낼 수 있을지, 아니면 해내게 될는지 하는 것은 모르는 일이다.
659+
이제껏 많은 '이해해야 하는 것'들을 이해하지 못한 경우가 수두룩했으니.
660+
DDPG를 '구현'해내기까지 해야 한다면 더 열심히 해야 하는 부분이 있다.
661+
662+
하지만, '열심히' 한다는 것과 '원리를 이해'하는 것은, 부차적인 문제가 되어야 한다는 것이다.
663+
중요한 것은 해당되는 일에 몰입할 수 있는 환경과 마음상태를 조성하는 것이다.
664+
그것이 갖춰지고 나면, 나는 열심히 하는 사람이고 또 원리를 이해하려고 하는 사람이라고 생각한다.
665+
나는 여건이 갖춰지면 가치있는 무언가를 만들어내는 사람이라고 생각한다.
666+
편안한 마음을 가지고 최대한 노력하자.
667+
실패한다면 뭐 어쩔 수 없겠지만, 그래도 해보면 되겠다.

0 commit comments

Comments
 (0)