# reduction_to_canonical_form

May 26th, 2024
464
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. #reduction_to_canonical_form
2. from drawing import ShowMatrixElement, ShowTable
3. from CreateW import CreateW, ChangeF
4.
5. def SetToCanon (A: int, N: int, M: int, more: bool) -> None:
6.     for i in range(M):
7.         for j in range(M):
8.             if j == i:
9.                 A[i].append( (more-0.5000)*(-2) )
10.             else:
11.                 A[i].append(0)
12.     ShowMatrixElement(A, -1, -1)
13.
14. def ChooseVariables(A: list, B: list, W: list) -> (int, int):
15.     M = len(A) # количество уравнений/строк
16.     N = len(A[0]) # количество переменных/столбцов
17.     #print(W) #отладка
18.     stolbec_number = 0
19.     for i in range( len(W) ):
20.         if W[i] < W[stolbec_number]:
21.             stolbec_number = i
22.     print(W[stolbec_number])#отладка
23.     for i in range(len(A)):
24.         stroka_number = i
25.         if A[i][stolbec_number] != 0:
26.             break
27.     indicator = 3**10
28.     for i in range( len(A) ):
29.         if not B[i]*A[i][stolbec_number]<0:
30.             continue
31.         #if abs( B[i]/A[i][stolbec_number] ) < abs(B[stroka_number]/A[stroka_number][stolbec_number]) :
32.         if abs( B[i]/A[i][stolbec_number] ) < indicator :
33.             indicator = abs( B[i]/A[i][stolbec_number] )
34.             stroka_number = i
35.     print(A[stroka_number][stolbec_number])#отладка
36.     return (stroka_number, stolbec_number)
37.
38. def ChangeVariables(A: list, B: list, stroka_number: int, stolbec_number: int, column: list, headers: list, W_or_F: bool, F = None):
39.     B[stroka_number] = B[stroka_number]/A[ stroka_number ][ stolbec_number ]*-1
40.     for j in range( len(A[0]) ):
41.         if (j != stolbec_number):
42.             A[ stroka_number ][j] = A[ stroka_number ][j]/A[ stroka_number ][ stolbec_number ]*-1
43.     A[stroka_number][stolbec_number] = 1/A[ stroka_number ][ stolbec_number ]
44.
45.     for i in range(len(A)):
46.         if i == stroka_number:
47.             continue
48.         else:
49.             B[i] += B[stroka_number]*A[i][stolbec_number]
50.             for j in range(len(A[0])):
51.                 if j != stolbec_number:
52.                     A[i][j] += A[i][stolbec_number] * A[stroka_number][j]
53.                 #A[i][stolbec_number] *= A[stroka_number][stolbec_number]
54.             A[i][stolbec_number] *= A[stroka_number][stolbec_number]
55.
56.
57.
60.     if not W_or_F:
61.         F = ChangeF( A, B, F, ChooseVariables(A, B, F)[0], ChooseVariables(A, B, F)[1])
62.     ShowTable(A, B, column, headers, (CreateW(A, B, column, headers) if W_or_F==True else F ) )
63.
64. def RemoveExtraVars(A: list, B:list, N: int, column: list, headers: list) -> (list, list, list, list):
65.     new_A = A.copy()
66.     new_B = B.copy()
67.     new_column = column.copy()
68.     for i in range(len(A)):
69.         if int(column[i][2]) > N:
70.             new_A.remove(A[i])
71.             new_B.remove(B[i])
72.             new_column.remove(column[i])
73.     column = new_column.copy()
74.     B = new_B.copy()
75.
77.     new_A = Transpose(new_A)
78.     A = new_A.copy()
79.     for j in range(len(A)):
81.             new_A.remove(A[j])
83.     A = Transpose(new_A).copy()
85.     return (A, B, column, headers)
86.     #
87.     '''
88.    A = [[A[j][i] for j in range(len(A))] for i in range(len(A[0]))]
89.    new_A = A.copy()
91.    for j in range(len(A)):
93.            new_A.remove(A[i])
95.    A = new_A.copy()
96.    A = [[A[j][i] for j in range(len(A))] for i in range(len(A[0]))]
98.    '''
99.     '''
100.    for i in :
101.        if int(i[2]) > N:
102.            A.pop(column.index(i))
103.            B.pop(column.index(i))
104.            column.remove(i)
105.            '''
106. '''
107.    for l in A: #иногда столбцы не удаляются, поэтому нужно пройти ещё раз
109.            if j[0] == 'y':
110.                for i in A: