added Gauss-Jordan

This commit is contained in:
2024-06-25 17:07:24 +02:00
parent d880ebd2aa
commit cfda844ebc
4 changed files with 84 additions and 4 deletions

53
src/gauss.typ Normal file
View File

@ -0,0 +1,53 @@
#import "mat.typ" as _mat
#let find-next-non-null(mat, x: 0, start-y: 0) = {
for y in range(start-y, mat.h) {
if mat.rows.at(y).at(x) != 0 {
return y
}
}
return none
}
#let echelon(mat) = {
_mat._check(mat)
let dim = calc.min(mat.w, mat.h)
let mat = mat
// Gauss
for i in range(dim) {
let pivot = mat.rows.at(i).at(i)
// Pivot != 0 -> divide to get 1
if pivot != 0 {
mat = _mat.div-row(mat, i, pivot)
} else {
let y = find-next-non-null(mat, x: i, start-y: i)
if y != none {
mat = _mat.add-row(mat, i, y, f: 1 / mat.rows.at(y).at(i))
}
}
// Make all rows below 0
for y in range(i + 1, mat.h) {
mat = _mat.add-row(mat, y, i, f: -mat.rows.at(y).at(i))
}
}
// Jordan
for y in range(dim) {
for x in range(y + 1, dim) {
mat = _mat.add-row(mat, y, x, f: -mat.rows.at(y).at(x))
}
}
return _mat.round(mat)
}
// solver = Solver(matrix, constants)
// solver.solve()
// gauss = Gaussificator(matrix, constants)
// gauss.echelon()