Skip to content

Commit a8416ea

Browse files
feat: menambahkan special matriks (#353)
* feat: menambahkan special matriks * fix: memperbaiki test * fix: memperbaiki test
1 parent 0838e9b commit a8416ea

1 file changed

Lines changed: 150 additions & 0 deletions

File tree

matrix/matriks_special.py

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
# https://en.wikipedia.org/wiki/Hankel_matrix
2+
# https://en.wikipedia.org/wiki/Toeplitz_matrix
3+
# https://en.wikipedia.org/wiki/Pascal_matrix
4+
# https://id.wikipedia.org/wiki/Matriks_identitas
5+
from typing import Union
6+
7+
8+
def faktorial(n) -> int:
9+
"""
10+
>>> faktorial(5)
11+
120
12+
"""
13+
if n < 0:
14+
raise ValueError("nilai harus positif")
15+
if n == 0:
16+
return 1
17+
else:
18+
f = 1
19+
for i in range(1, n + 1):
20+
f *= i
21+
return f
22+
23+
24+
def kombinasi(n: int, r: int) -> int:
25+
"""
26+
>>> kombinasi(5, 2)
27+
10.0
28+
"""
29+
if n < 0 or r < 0:
30+
raise ValueError("Nilai Harus Positif")
31+
if r > n:
32+
return 0
33+
else:
34+
penyebut = faktorial(n)
35+
pembilang = faktorial(r) * faktorial(n - r)
36+
C = penyebut / pembilang
37+
return C
38+
39+
40+
def identity(n: int = 2) -> list[list[Union[int]]]:
41+
"""
42+
Membuat matriks identitas
43+
44+
>>> identity(3)
45+
[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
46+
"""
47+
A = []
48+
for i in range(n):
49+
row = []
50+
for j in range(n):
51+
if j == i:
52+
row.append(1)
53+
else:
54+
row.append(0)
55+
A.append(row)
56+
return A
57+
58+
59+
def hankel(A, b=1) -> list[list[Union[int, float]]]:
60+
"""
61+
Membuat matriks hankel
62+
63+
>>> hankel(3)
64+
[[1, 2, 3], [2, 3, 4], [3, 4, 5]]
65+
"""
66+
res = []
67+
for i in range(b, A + 1):
68+
row = []
69+
for j in range(b, A + 1):
70+
row.append(i + j - 1)
71+
res.append(row)
72+
return res
73+
74+
75+
def toeplite(A, b=1) -> list[list[Union[int, float]]]:
76+
"""
77+
Membuat matriks hankel
78+
79+
>>> toeplite(3)
80+
[[0, -1, -2], [1, 0, -1], [2, 1, 0]]
81+
"""
82+
res = []
83+
for i in range(b, A + 1):
84+
row = []
85+
for j in range(b, A + 1):
86+
row.append(i - j)
87+
res.append(row)
88+
return res
89+
90+
91+
def hilbert(A, b=1) -> list[list[Union[int, float]]]:
92+
"""
93+
Membuat matriks hilbert
94+
95+
>>> hilbert(2)
96+
[[1.0, 0.5], [0.5, 0.3333333333333333]]
97+
"""
98+
res = []
99+
for i in range(b, A + 1):
100+
row = []
101+
for j in range(b, A + 1):
102+
row.append(1 / (i + j - 1))
103+
res.append(row)
104+
return res
105+
106+
107+
def pascal(n, kind="simetri") -> list[list[Union[int, float]]]:
108+
"""
109+
Membuat matriks pascal dengan beberapa tipe
110+
111+
>>> pascal(3)
112+
[[1.0, 1.0, 1.0], [1.0, 2.0, 3.0], [1.0, 3.0, 6.0]]
113+
>>> pascal(3, kind = 'lower')
114+
[[1.0, 0, 0], [1.0, 1.0, 0], [1.0, 2.0, 1.0]]
115+
"""
116+
L_n = []
117+
for i in range(n):
118+
colum = []
119+
for j in range(n):
120+
x = kombinasi(i, j)
121+
colum.append(x)
122+
L_n.append(colum)
123+
124+
r, c = len(L_n), len(L_n[0])
125+
t = [[0] * r for _ in range(c)]
126+
for i in range(r):
127+
for j in range(c):
128+
t[j][i] = L_n[i][j]
129+
130+
res = [[0 for _ in range(len(L_n))] for _ in range(len(L_n))]
131+
x = len(L_n)
132+
y = len(t)
133+
y1 = len(t[0])
134+
for i in range(x):
135+
for j in range(y1):
136+
for k in range(y):
137+
res[i][j] += L_n[i][k] * t[k][j]
138+
139+
if kind.lower() == "lower":
140+
return L_n
141+
elif kind.lower() == "upper":
142+
return t
143+
else:
144+
return res
145+
146+
147+
if __name__ == "__main__":
148+
import doctest
149+
150+
doctest.testmod()

0 commit comments

Comments
 (0)