added Gauss-Jordan
This commit is contained in:
53
src/gauss.typ
Normal file
53
src/gauss.typ
Normal 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()
|
Reference in New Issue
Block a user