Skip to content

Instantly share code, notes, and snippets.

@Noah765
Last active June 21, 2024 10:27
Show Gist options
  • Save Noah765/bae6df082923992a2b1d500787b79964 to your computer and use it in GitHub Desktop.
Save Noah765/bae6df082923992a2b1d500787b79964 to your computer and use it in GitHub Desktop.
Solver for linear systems of equations (using the Gaussian method)
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