From 1577ed77ed1b50420c8e417a1e3df832aca77946 Mon Sep 17 00:00:00 2001 From: helldh Date: Sat, 17 Jan 2026 00:16:14 +0300 Subject: [PATCH] Gauss implementation --- .gitignore | 1 + .idea/.gitignore | 3 + .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/mathing.iml | 10 ++++ .idea/misc.xml | 7 +++ .idea/modules.xml | 8 +++ __pycache__/algo.cpython-313.pyc | Bin 0 -> 3150 bytes __pycache__/tests.cpython-313.pyc | Bin 0 -> 2564 bytes algo.py | 56 ++++++++++++++++++ tests.py | 45 ++++++++++++++ 10 files changed, 136 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/mathing.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 __pycache__/algo.cpython-313.pyc create mode 100644 __pycache__/tests.cpython-313.pyc create mode 100644 algo.py create mode 100644 tests.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1d17dae --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.venv diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/mathing.iml b/.idea/mathing.iml new file mode 100644 index 0000000..b918ff6 --- /dev/null +++ b/.idea/mathing.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..dcca035 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e1b379b --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/__pycache__/algo.cpython-313.pyc b/__pycache__/algo.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0942d895cd0c12ee85deb954d4e0272d75fb9744 GIT binary patch literal 3150 zcmaJ@?N3|R9X{7@*al)CINcHm*Q8DBuGpmkMM8na+A^^+n0PJqLa3L*`D9I*Tf|2F7kaj z=lAkF&+m86VXwN{$#CVCMq_s!jQx#1N>_#Pve$)|1r}sM;cfO4K^8<7G+h$#XR>03 zenE5TD`+Xbwb_E!qiob7n@4QkiYKsQUO}^*kEPODRWvCL567Z0DUnWTRl~9*4aBAR zpd_a>n=GX#xV|%#7dOFEQHB`W^kw1=c5&rbDdVcu$!6$c|rOQ)%=t>psd@ z+!10S2f_U*-JZL`f<9OB5m`?IW0g!~-xBfn6fr0y%+KaS4&*d&Bj;hp5|$7PTPU3# zJ!tB9pRpm>^wcuUB+Mdv$3$7e=4d5jeI?N$X$grWgv}ub`9=9)Ssic4`7-lX zOi)KTmAtZ|6qGfks60>#>W4~E{X|sOl@)bb*;MW;1yT7G#%I(ib&5XjD{Ex1sw~6n zzM8?@w6X!yhawD$Fq=leb#+dJ4`yMvfq@Oge<%hf#ZGb1=X5Ib$oNNP6Bb1{tamtD zeWLO^KCq6Vj5_-i&C(E$vVo`{6F#Kn&L65XVqf6;;ANllErj@W30^_@0$4XG z34n1jYsx+FD|9$TQEU;FoI1;MjK|(fraMICOK{F8%jz6}>X-py4JOMvyN~z>lu}loe4uKng{J3aGk{p(NA`nm$j2 ziu;AK(jg8E&89Sut*CQDWe+#U-UeD7JTRKb5uOHxv431uAs`iy?9sZzB5!y(ESB(PTra~jn;xERhU?=?W>26dkDunS?@2df}tTb_cGxw z>G2tCH`QAt6d<5Ur}RRi6JZEQXy01~<^Q3b(P(II4xF!@4so(Cb{WFGhG5ih_jvRT z-i+WuZMcD^1*94Hq5WS&4{fR+sW;V|SR7ckoH4E0Wkl*5y)3?tn0Oc~cC;(z_3qcB z9b$e8+XqmCh|i)|_#bC80i=K1L9+e{n^Ysbah-HfXrWS1Yv>^#k8-NUFjUI?2eP{!-p^dm!Jdx?f%NEC!Zde(d(Gy8e|SXfwx-3jk{#lMw%Zo&{9$f;=*=-(Ok&0EY-l|8>@|86F* zQ(ZUT`ti@Q!nVDBzIWF3C;M^Lemr-5F>v?BW4r&UnH@Uvjg1{TY*^KQC+pa$Ju-ha z=ect%8`yRo%LQg{n1+}I* zYyCS<*?M~-7rE1fv~JHc`Cn1p{_Kx-+(&b*xk%n~SGqGWFKn0Gw`!X6!;9C8fu$S8 ztExYso(!lpfv;+s_ss0bD|=Q}=Xu%)lDj9FvodSWMrJDvRpzhWZqGI61|L^@vcgVn z{p0%Xb!##5$n#Ko)VuE5s_)*a?atcvGXZG+UA5+W<;h%utdRB0S)N+ip=Oe!I@7&} zQm_kNi)Kq-8%IydR2$7YJeG{4d97rssVvfsSJQqbo*bGOle%Q;LRw@g>d9TRAP9e9 zFYQ{|h3Z^7|HDQ1=WnY`Z|>rs?CR~N6Zvy@KiI`Tr`6m3Q-yO&AN+&fdD#B~KIqZ~ literal 0 HcmV?d00001 diff --git a/__pycache__/tests.cpython-313.pyc b/__pycache__/tests.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67d0b3296eaed130153a52a6de0a3612225c509a GIT binary patch literal 2564 zcmbtV+iw(A7(a8}X*)|>*p?QBj@1BDfmLcD;*F|ABeoVsv9TnRad*1AWOuebGm`*M zP@^n?=t|Or2NR8N^{E=GD3`xsCMa!=m=Jw1`_{A=6QBIPnQbklAi>klZ_b?Wvgdr4 z-&ss18wrg3SH}vfOvvx}u{5OmWRb#Tk{HC`4ibuQ{vh`TPkD`WkZxiKn}{JEC5OR& z_2?7g6)GN;3~ApmA=Y|AKv!L@Nx)NIeNiJhF30I|4ZjCplnEh2}7nzE}<)|`EA?vUPI3Vk>i>OJ~B%l z(QyJEJi+1w07QT@xHNC@hLGmdyu%ryA;Fs;S+*Ho-^YV03`a0zBLPxzq#gr8hM!rI zZXmC>5#odH*pYY0;iX8&rV$PwF%+ZWSwSNM8wqJ55R*o|$sYn?@OgMDxE7ucCxV&a zhp-Y%ho5M>kMGvP)4`?s@|9p3KDF?J;A(Iw_%WCcE{ErXtKqreiU!s*U^NqoW`Zj< z+?;HFEKmoGTEv zHeTFN-3LoBk#D5*v#(bA=hT*2wL4V1zj%6@3)JrG>h1-BwDl~4>;Eb+C@e!T#Cm~A zhJ2p_OBl-kDzFBl@s0v((pA43wirx?XTwjm;9Br4)X4N2wM831jVcJ(^%O~jV#!c! z?0UJ7{WOV7>kyg&25Bo!QvfS7O&^5?*0P)x%PD(#n=#f02Cbj77uav>R*sbAbt4$h5o-Iyo%o7KL^|CJ>L7Ut*Q%g(4)vBz(SOY zC;|0_NVvSJ3$-Xkn3x)-0!*T`V5W2Mz)U{P#d1xDcL0 zDi6McMngJ=W&5!#Lb7Y=bTc)-MQbGAp#nYDAaV^hlm zay{XCz~fujY|*>)o List[float]: + """ + Реализация метода Гаусса для квадратной системы уравнений Ax = b. + + Алгоритм: + 1. Формируем расширенную матрицу [A|b]. + 2. Для каждого столбца: + - Ищем pivot: первый ненулевой элемент в текущем столбце от текущей строки вниз. + - Если pivot ≠ текущая строка, меняем строки местами. + 3. Обнуляем все элементы под pivot: + - Для каждой строки ниже: factor = current / pivot + - Текущая строка -= factor * строка с pivot + 4. После приведения к ступенчатой форме выполняем обратную подстановку: + - Проходим снизу вверх + - Для каждой переменной: x[i] = (свободный член - сумма(коэффициентов[i][j] * x[j] для j>i)) / pivot + 5. Возвращаем список решений x. + + Входные данные: + - coefficients: квадратная матрица коэффициентов A + - free_members: вектор свободных членов b + + Выход: + - Список решений x + """ + n = len(coefficients) + for i in range(n): + coefficients[i].append(free_members[i]) + + for i in range(n): + pivot_row = None + for r in range(i, n): + if coefficients[r][i] != 0: + pivot_row = r + break + if pivot_row is None: + raise ValueError("Система несовместна или вырождена") + + if pivot_row != i: + coefficients[i], coefficients[pivot_row] = coefficients[pivot_row], coefficients[i] + + pivot = coefficients[i][i] + + for r in range(i + 1, n): + factor = coefficients[r][i] / pivot + for c in range(i, n + 1): + coefficients[r][c] -= factor * coefficients[i][c] + + x = [0] * n + for i in range(n - 1, -1, -1): + sum_ax = sum(coefficients[i][j] * x[j] for j in range(i + 1, n)) + x[i] = (coefficients[i][n] - sum_ax) / coefficients[i][i] + + return x diff --git a/tests.py b/tests.py new file mode 100644 index 0000000..bd1a125 --- /dev/null +++ b/tests.py @@ -0,0 +1,45 @@ +import unittest +from algo import gauss_method + +class TestGaussMethod(unittest.TestCase): + def test_2x2_unique_solution(self): + """Простейшая 2x2 система с уникальным решением""" + coef = [[1, 1], + [2, 3]] + free_mem = [5, 11] + result = gauss_method(coef, free_mem) + expected = [4.0, 1.0] + for r, e in zip(result, expected): + self.assertAlmostEqual(r, e, places=7) + + def test_2x2_another(self): + """Ещё одна 2x2 система""" + coef = [[2, 1], + [4, 3]] + free_mem = [5, 11] + result = gauss_method(coef, free_mem) + expected = [2.0, 1.0] + for r, e in zip(result, expected): + self.assertAlmostEqual(r, e, places=7) + + def test_3x3_unique_solution(self): + """3x3 система с уникальным решением""" + coef = [[1, 1, 1], + [2, 3, 1], + [1, 2, 3]] + free_mem = [6, 11, 14] + result = gauss_method(coef, free_mem) + expected = [1.0, 2.0, 3.0] + for r, e in zip(result, expected): + self.assertAlmostEqual(r, e, places=7) + + def test_degenerate_system(self): + """Вырожденная система должна выбросить исключение""" + coef = [[1, 1], + [2, 2]] + free_mem = [2, 4] + with self.assertRaises(ValueError): + gauss_method(coef, free_mem) + +if __name__ == "__main__": + unittest.main() \ No newline at end of file