Last active
June 21, 2024 10:27
-
-
Save Noah765/bae6df082923992a2b1d500787b79964 to your computer and use it in GitHub Desktop.
Solver for linear systems of equations (using the Gaussian method)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:math'; | |
void main() { | |
final matrix = <List<double>>[ | |
[1, -4, 5, 3], | |
[3, 3, 7, 13], | |
[0, -2, -3, -1], | |
]; | |
print('Input:'); | |
printMatrix(matrix); | |
final numberOfRows = matrix.length; | |
final numberOfColumns = matrix[0].length; | |
for (var i = 0; i < numberOfRows - 1; i++) { | |
for (var row = i + 1; row < numberOfRows; row++) { | |
final factor = matrix[row][i] / matrix[i][i]; | |
for (var column = i; column < numberOfColumns; column++) { | |
matrix[row][column] = matrix[row][column] - factor * matrix[i][column]; | |
} | |
} | |
} | |
print('\nReduced row echelon form:'); | |
printMatrix(matrix); | |
final reversedResults = []; | |
for (var i = numberOfRows - 1; i >= 0; i--) { | |
var result = matrix[i].last; | |
for (var j = 0; j < reversedResults.length; j++) { | |
result -= matrix[i][numberOfColumns - 2 - j] * reversedResults[j]; | |
} | |
result /= matrix[i][numberOfColumns - 2 - reversedResults.length]; | |
reversedResults.add(result); | |
} | |
print('\nResult:'); | |
printResult(List.from(reversedResults.reversed)); | |
} | |
extension DoubleToPrettyString on double { | |
String toPrettyString() => ((this * 100).round() / 100).toString(); | |
} | |
void printMatrix(List<List<double>> matrix) { | |
final numberOfRows = matrix.length; | |
final numberOfColumns = matrix[0].length; | |
final columnWidths = <int>[]; | |
for (var column = 0; column < numberOfColumns; column++) { | |
var width = 1; | |
for (var row = 0; row < numberOfRows; row++) { | |
width = max(width, matrix[row][column].toPrettyString().length); | |
} | |
columnWidths.add(width); | |
} | |
String stringifyRow(int row) { | |
final result = []; | |
for (var i = 0; i < numberOfColumns; i++) { | |
final width = columnWidths[i]; | |
final string = matrix[row][i].toPrettyString(); | |
final rightPadding = ' ' * | |
((width - string.length) ~/ 2); // Right padding takes precedence | |
final leftPadding = ' ' * (width - string.length - rightPadding.length); | |
result.add('$leftPadding$string$rightPadding'); | |
} | |
return result.join(' '); | |
} | |
print('⎡ ${stringifyRow(0)} ⎤'); | |
for (var i = 1; i < matrix.length - 1; i++) { | |
print('⎢ ${stringifyRow(i)} ⎥'); | |
} | |
print('⎣ ${stringifyRow(numberOfRows - 1)} ⎦'); | |
} | |
void printResult(List<double> result) { | |
print('{ (${result.map((e) => e.toPrettyString()).join('|')}) }'); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment