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