feidmath v0.1
Koleksi LAMBDA feidmath v0.1
feidlambda-math
atau feidmath merupakan kumpulan fungsi LAMBDA yang fokus menyelesaikan beberapa permasalahan matematis seperti perkalian matriks, rotasi, interpolasi, dlsbnya. Pengembangan feidmath diusahakan tidak memerlukan fungsi dari feidlambda sehingga fungsi yang tersedia feidmath terisolasi dan dapat digunakan secara langsung sesuai kebutuhan. feidmath dibuat untuk fokus pengembangan yang bersifat penerapan dengan fungsi matematika. feidmath merupakan langkah awal untuk pengembangan koleksi LAMBDA lainnya yang bersifat terapan.
feidmath v0.1 di rilis bersamaan dengan feidlambda v0.4.
Fungsi feidmath v0.1.x
Mengikuti panduan FIAKO LAMBDA Style Guide dan feidlambda v0.4, feidmath dipisahkan dengan kategori yang sesuai dengan fungsi yang tersedia. Berikut kategori yang tersedia di feidmath v0.1.x:
- NEW
INTERPOLATION_*
: Kategori ini berisi fungsi untuk estimasi nilai berdasarkan data yang sudah diketahui. - NEW
LINALG_*
: Ini mencakup fungsi-fungsi yang berkaitan dengan aljabar linear, seperti operasi pada vektor dan matriks - NEW
GEOMETRY_*
: Kategori ini melibatkan fungsi geometri, termasuk mengidentifikasi titik berada di dalam/luar poligon.
Download excel demonstrasi RELEASE_feidmath_v0_1_0.xlsx, untuk memudahkan mengeksplorasi fungsi baru di feidmath v0.1.x.
Kategori INTERPOLATION_*
NEW v0.1 Kategori INTERPOLATION_*
merupakan kumpulan fungsi untuk mengestimasi nilai berdasarkan data yang sudah diketahui. Hubungan antar fungsi di kategori ini bisa dilihat di Gambar 2.1.
Fungsi utama kategori INTERPOLATION_*
yaitu INTERPOLATION_LINEAR()
.
Source Code INTERPOLATION_*
// NONE ---> _INTERPOLATION_LINEAR
= LAMBDA(x, known_ys, known_xs,
_INTERPOLATION_LINEAR LET(
, TOCOL(known_xs),
known_xs, TOCOL(known_ys),
known_ys, ROWS(known_ys),
nrow, HSTACK(known_xs, known_ys),
known_table, SORT(known_table, 1),
sorted_table, CHOOSECOLS(sorted_table, 1),
sorted_xs, CHOOSECOLS(sorted_table, 2),
sorted_ys, IFS(
nearest_x> MAX(sorted_xs),
x XMATCH(x, sorted_xs, -1),
< MIN(sorted_xs),
x XMATCH(x, sorted_xs, 1),
,
TRUEXMATCH(x, sorted_xs, -1)
),
, IF(
index_ys< nrow,
nearest_x VSTACK(nearest_x, nearest_x + 1),
VSTACK(nearest_x - 1, nearest_x)
),
, CHOOSEROWS(sorted_ys, index_ys),
select_ys, CHOOSEROWS(sorted_xs, index_ys),
select_xs.LINEAR(x, select_ys, select_xs)
FORECAST)
);
// _INTERPOLATION_LINEAR ---> INTERPOLATION_LINEAR
= LAMBDA(x_vector, known_ys, known_xs,
INTERPOLATION_LINEAR LET(
, TOCOL(x_vector),
x_vector, BYROW(
y_vector,
x_vectorLAMBDA(x, _INTERPOLATION_LINEAR(x, known_ys, known_xs))
),
y_vector)
);
INTERPOLATION_LINEAR()
Fungsi INTERPOLATION_LINEAR(x_vector, known_y, known_x)
digunakan untuk mencari nilai interpolasi linear. Fungsi ini dikembangkan menggunakan fungsi bawaan FORECAST.LINEAR(...)
. Fungsi ini bisa menerima input scalar maupun vector.
- Syntax
- INTERPOLATION_LINEAR(x_vector, known_y, known_x)
- Output
- scalar / vector
x_vector := [scalar | vector]
- Poin data yang ingin Anda prediksikan nilainya.
known_ys := [vector]
- vector atau rentang data terikat.
known_xs := [vector]
- vector atau rentang data terikat.
Kategori LINALG_*
NEW v0.1 Kategori LINALG_*
merupakan kumpulan fungsi yang berkaitan dengan aljabar linear seperti operasi pada vektor atau matriks. LINALG
merupakan singkatan dari LINEAR ALGEBRA
. Hubungan antar fungsi di kategori ini bisa dilihat di Gambar 3.1.
%%{ init: { 'theme': 'forest' } }%% flowchart LR NONE ---> LINALG_ROTATION_MATRIX LINALG_ROTATION_MATRIX ---> LINALG_ROTATE_POINT LINALG_ROTATE_POINT ---> _RECURSIVE_ROTATE_POINTS _RECURSIVE_ROTATE_POINTS ---> _RECURSIVE_ROTATE_POINTS _RECURSIVE_ROTATE_POINTS ---> LINALG_ROTATE_POINT_ARRAY
LINALG_*
Fungsi utama kategori LINALG_*
yaitu LINALG_ROTATION_MATRIX()
, LINALG_ROTATE_POINT()
, dan LINALG_ROTATE_POINT_ARRAY()
.
Source Code LINALG_*
// NONE ---> LINALG_ROTATION_MATRIX
= LAMBDA(theta_x, theta_y, theta_z, [num_digits],
LINALG_ROTATION_MATRIX LET(
, IF(ISOMITTED(num_digits), 0, num_digits),
round_number, RADIANS(theta_x),
angle_x, RADIANS(theta_y),
angle_y, RADIANS(theta_z),
angle_z, COS(angle_x),
cos_x, SIN(angle_x),
sin_x, VSTACK(
rotation_xHSTACK(1, 0, 0),
HSTACK(0, cos_x, -sin_x),
HSTACK(0, sin_x, cos_x)
),
, COS(angle_y),
cos_y, SIN(angle_y),
sin_y, VSTACK(
rotation_yHSTACK(cos_y, 0, sin_y),
HSTACK(0, 1, 0),
HSTACK(-sin_y, 0, cos_y)
),
, COS(angle_z),
cos_z, SIN(angle_z),
sin_z, VSTACK(
rotation_zHSTACK(cos_z, -sin_z, 0),
HSTACK(sin_z, cos_z, 0),
HSTACK(0, 0, 1)
),
, MMULT(rotation_z, MMULT(rotation_y, rotation_x)),
rotation_matrixIF(
,
round_numberROUND(rotation_matrix, round_number),
rotation_matrix)
)
);
// LINALG_ROTATION_MATRIX ---> LINALG_ROTATE_POINT
= LAMBDA(
LINALG_ROTATE_POINT ,
point_vector,
theta_x,
theta_y,
theta_z[active_rotation],
[num_digits],
LET(
, IF(
active_rotationISOMITTED(active_rotation),
,
TRUE
active_rotation),
, LINALG_ROTATION_MATRIX(
rotation_matrix,
theta_x,
theta_y,
theta_z
num_digits),
, TOCOL(point_vector),
point_vector, IF(
final_rotation,
active_rotation,
rotation_matrixTRANSPOSE(rotation_matrix)
),
, MMULT(final_rotation, point_vector),
point_rotationTOROW(point_rotation)
)
);
// LINALG_ROTATE_POINT ---> _RECURSIVE_ROTATE_POINTS
// _RECURSIVE_ROTATE_POINTS ---> _RECURSIVE_ROTATE_POINTS
= LAMBDA(
_RECURSIVE_ROTATE_POINTS ,
ntry,
data_points,
theta_x,
theta_y,
theta_z[active_rotation],
[num_digits],
LET(
, CHOOSEROWS(data_points, ntry),
selected_rowIF(
= 1,
ntry LINALG_ROTATE_POINT(
,
selected_row,
theta_x,
theta_y,
theta_z,
active_rotation
num_digits),
LET(
, ntry - 1,
next_try, LINALG_ROTATE_POINT(
result,
selected_row,
theta_x,
theta_y,
theta_z,
active_rotation
num_digits),
VSTACK(
_RECURSIVE_ROTATE_POINTS(
,
next_try,
data_points,
theta_x,
theta_y,
theta_z,
active_rotation
num_digits),
result)
)
)
)
);
// _RECURSIVE_ROTATE_POINTS ---> LINALG_ROTATE_POINT_ARRAY
= LAMBDA(
LINALG_ROTATE_POINT_ARRAY ,
data_points,
theta_x,
theta_y,
theta_z[active_rotation],
[num_digits],
_RECURSIVE_ROTATE_POINTS(
ROWS(data_points),
,
data_points,
theta_x,
theta_y,
theta_z,
active_rotation
num_digits)
);
LINALG_ROTATION_MATRIX()
Fungsi LINALG_ROTATION_MATRIX(theta_x, theta_y, theta_z, [num_digits])
digunakan untuk menghasilkan matriks rotasi berdasarkan tiga sudut rotasi (\(\theta_x\), \(\theta_y\), dan \(\theta_z\)) yang ditentukan dalam derajat.
- Syntax
- LINALG_ROTATION_MATRIX(theta_x, theta_y, theta_z, [num_digits])
- Output
- \(3 \times 3\) array
theta_x | theta_y | theta_z := [number]
- Rotasi terhadap sumbu-nya dalam satuan derajat.
[num_digits] := 0 :: [number]
-
Nilai default yaitu
0
(tidak dibulatkan). Jumlah digit presisi yang diinginkan.
LINALG_ROTATION_MATRIX()
LINALG_ROTATE_POINT()
Fungsi LINALG_ROTATE_POINT(point_vector, theta_x, theta_y, theta_z, [active_rotation], [num_digits])
digunakan untuk melakukan rotasi pada titik dalam ruang tiga dimensi. Fungsi ini menerima input dalam bentuk vektor dengan tiga nilai yaitu \(x\), \(y\), dan \(z\).
- Syntax
- LINALG_ROTATE_POINT(point_vector, theta_x, theta_y, theta_z, [active_rotation], [num_digits])
- Output
- vector
point_vector := [number vector]
- Koordinat titik dalam bentuk vektor (\(x\), \(y\), \(z\)).
theta_x | theta_y | theta_z := [number]
- Rotasi terhadap sumbu-nya dalam satuan derajat.
[active_rotation] := TRUE :: [TRUE | FALSE]
-
Nilai default yaitu
TRUE
. Rotasi aktif akan mengubah posisi objek, sedangkan rotasi pasif akan mengubah sistem koordinat. [num_digits] := 0 :: [number]
-
Nilai default yaitu
0
(tidak dibulatkan). Jumlah digit presisi yang diinginkan.
LINALG_ROTATE_POINT()
LINALG_ROTATE_POINT_ARRAY()
Fungsi LINALG_ROTATE_POINT_ARRAY(data_points, theta_x, theta_y, theta_z, [active_rotation], [num_digits])
digunakan untuk melakukan rotasi pada sekumpulan titik dalam ruang tiga dimensi. Fungsi LINALG_ROTATE_POINT_ARRAY()
sama dengan LINALG_ROTATE_POINT()
tetapi dirancang untuk merotasikan sekumpulan titik sekaligus. Argumen data_points
harus berupa array yang setiap barisnya merepresentasikan titik di ruang 3D. Fungsi ini menerima array dengan tiga kolom yaitu \(x\), \(y\), dan \(z\).
- Syntax
- LINALG_ROTATE_POINT_ARRAY(data_points, theta_x, theta_y, theta_z, [active_rotation], [num_digits])
- Output
- \(m \times 3\) array
data_points := [number array]
- Sekumpulan koordinat titik dalam bentuk array dengan kolom \(x\), \(y\), \(z\).
theta_x | theta_y | theta_z := [number]
- Rotasi terhadap sumbu-nya dalam satuan derajat.
[active_rotation] := TRUE :: [TRUE | FALSE]
-
Nilai default yaitu
TRUE
. Rotasi aktif akan mengubah posisi objek, sedangkan rotasi pasif akan mengubah sistem koordinat. [num_digits] := 0 :: [number]
-
Nilai default yaitu
0
(tidak dibulatkan). Jumlah digit presisi yang diinginkan.
LINALG_ROTATE_POINT_ARRAY()
Visualisasi Aktif vs. Pasif
Berikut visualisasi perbedaan antara merotasikan objek (aktif) dan koordinatnya (pasif). Rotasi terhadap sumbu \(z\) dengan grafik hubungan \(x\) dan \(y\).
Kategori GEOMETRY_*
NEW v0.1 Kategori GEOMETRY_*
berisikan fungsi geometri seperti mengidentifikasi titik berada di dalam/luar poligon. Hubungan antar fungsi di kategori ini bisa dilihat di Gambar 4.1.
%%{ init: { 'theme': 'forest' } }%% flowchart LR NONE ---> GEOMETRY_IS_POINT_IN_POLYGON GEOMETRY_IS_POINT_IN_POLYGON ---> GEOMETRY_ARE_POINTS_IN_POLYGON
GEOMETRY_*
Fungsi utama kategori GEOMETRY_*
yaitu GEOMETRY_POINT_IN_POLYGON()
dan GEOMETRY_ARE_POINTS_IN_POLYGON()
.
Source Code GEOMETRY_*
// NONE ---> GEOMETRY_IS_POINT_IN_POLYGON
= LAMBDA(point_vector, data_polygon,
GEOMETRY_IS_POINT_IN_POLYGON LET(
, TOCOL(point_vector),
point_vector, INDEX(point_vector, 1),
xp, INDEX(point_vector, 2),
yp, DROP(data_polygon, -1),
data_1, DROP(data_polygon, 1),
data_2, HSTACK(data_1, data_2),
data_joined, CHOOSECOLS(data_joined, 1),
_x1, CHOOSECOLS(data_joined, 2),
_y1, CHOOSECOLS(data_joined, 3),
_x2, CHOOSECOLS(data_joined, 4),
_y2, (yp < _y1) <> (yp < _y2),
first_condition, xp <
second_condition(_x1 + (((yp - _y1) / (_y2 - _y1)) * (_x2 - _x1))),
, IFERROR(
final_condition(first_condition * second_condition) = 1,
FALSE),
, MOD(SUM(INT(final_condition)), 2) = 1,
is_inside
is_inside)
);
// GEOMETRY_IS_POINT_IN_POLYGON ---> GEOMETRY_ARE_POINTS_IN_POLYGON
= LAMBDA(data_points, polygon_points,
GEOMETRY_ARE_POINTS_IN_POLYGON BYROW(
,
data_pointsLAMBDA(row, GEOMETRY_IS_POINT_IN_POLYGON(row, polygon_points))
)
);
GEOMETRY_IS_POINT_IN_POLYGON()
Fungsi GEOMETRY_IS_POINT_IN_POLYGON(point_vector, polygon_points)
digunakan untuk menentukan apakah sebuah titik berada di dalam atau di luar sebuah poligon yang tertutup. Titik yang akan dicek dinyatakan oleh point_vector
, sedangkan polygon_points
adalah array yang setiap barisnya merepresentasikan titik dari poligon. Fungsi ini mengembalikan nilai boolean
/logical
, yaitu TRUE
jika titik berada di dalam poligon, dan FALSE
jika tidak.
- Referensi
- Fungsi ini dikembangkan berdasarkan video Checking if a point is inside a polygon is RIDICULOUSLY simple (Ray casting algorithm) - Inside code oleh Inside code.
- Syntax
- GEOMETRY_IS_POINT_IN_POLYGON(point_vector, polygon_points)
- Output
- logical
point_vector := [number vector]
- Koordinat titik yang ingin dicek dalam bentuk vektor (\(x\), \(y\)).
polygon_points := [number array]
- Sekumpulan koordinat titik yang membentuk poligon dalam bentuk array dengan kolom \(x\), \(y\).
GEOMETRY_IS_POINT_IN_POLYGON()
GEOMETRY_ARE_POINTS_IN_POLYGON()
Fungsi GEOMETRY_ARE_POINTS_IN_POLYGON(data_points, polygon_points)
sama dengan GEOMETRY_IS_POINT_IN_POLYGON()
tetapi dirancang untuk mengecek sejumlah titik sekaligus. Argumen data_points harus berupa array yang setiap barisnya merepresentasikan titik yang akan dicek. Seperti halnya fungsi GEOMETRY_IS_POINT_IN_POLYGON()
, fungsi ini mengembalikan array nilai boolean
, yaitu TRUE
untuk titik-titik yang berada di dalam poligon dan FALSE
untuk titik-titik yang berada di luar poligon.
- Syntax
- GEOMETRY_ARE_POINTS_IN_POLYGON(data_points, polygon_points)
- Output
- logical vector
data_points := [number array]
- Sekumpulan koordinat titik yang ingin dicek dalam bentuk array \(m \times 2\) dengan kolom (\(x\), \(y\)).
polygon_points := [number array]
- Sekumpulan koordinat titik yang membentuk poligon dalam bentuk array dengan kolom \(x\), \(y\).
GEOMETRY_ARE_POINTS_IN_POLYGON()
Fungsi feidmath v0.1 memiliki \(3\) kategori dengan total \(6\) fungsi utama.
Jika memiliki ide untuk pengembangan feidlambda atau fungsi baru bisa langsung disampaikan dengan membuat isu di github. Dan jika bertemu masalah saat penggunaan feidmath v0.1, bisa juga membuat isu di github.
Changelog
- 2023-05-26 (v0.1.0)
- Rilis feidmath v0.1
- Kategori baru:
INTERPOLATION
- Fungsi baru:
INTERPOLATION_LINEAR()
- Fungsi baru:
- Kategori baru:
LINALG
(LINEAR ALGEBRA)- Fungsi baru:
LINALG_ROTATION_MATRIX()
- Fungsi baru:
LINALG_ROTATE_POINT()
- Fungsi baru:
LINALG_ROTATE_POINT_ARRAY()
- Fungsi baru:
- Kategori baru:
GEOMETRY
- Fungsi baru:
GEOMETRY_IS_POINT_IN_POLYGON()
- Fungsi baru:
GEOMETRY_ARE_POINTS_IN_POLYGON()
- Fungsi baru:
- Kategori baru:
- Rilis feidmath v0.1