More test for formula solver

This commit is contained in:
Álvaro González 2026-04-13 17:13:13 +02:00
parent 7b5194d04c
commit 1757d13b6e
2 changed files with 27 additions and 5 deletions

View file

@ -415,6 +415,7 @@ Number functionSolver(
while (iter < maxNewtonIters) { while (iter < maxNewtonIters) {
final Number y = f(x); final Number y = f(x);
print( "iter: $iter x: $x y: $y");
if (y == 0 || y.abs() <= maxDelta) { if (y == 0 || y.abs() <= maxDelta) {
return x; return x;
} }
@ -446,9 +447,16 @@ Number functionSolver(
try { try {
return searchNewton(); return searchNewton();
} catch (e) { } catch (e1) {
try {
var approx = searchApproximately(hint, hint + step); var approx = searchApproximately(hint, hint + step);
return binarySearch(approx[0], approx[1]); return binarySearch(approx[0], approx[1]);
} }
catch( e2 ){
errorHandler.notify(e1);
errorHandler.notify(e2);
throw NoSolutionException("Failed to find a root using both Newton-Raphson and approximate search: $e1 -- $e2");
}
}
} }

View file

@ -1,7 +1,8 @@
import 'dart:math' as Math;
import 'package:d4rt_formulas/formula_evaluator.dart'; import 'package:d4rt_formulas/formula_evaluator.dart';
import 'package:d4rt_formulas/formula_models.dart'; import 'package:d4rt_formulas/formula_models.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'dart:math' as Math;
void main() { void main() {
@ -22,6 +23,20 @@ void main() {
expect( solution, closeTo(5, 1e-10)); expect( solution, closeTo(5, 1e-10));
}); });
test("Solve x formula", () {
final formula = Formula(
name: 'Test x',
input: [
VariableSpec(name: 'x', unit: 'scalar'),
],
output: VariableSpec(name: 'y', unit: 'scalar'),
d4rtCode: 'y = x;',
);
var solution = formulaSolver(formula, "x", {"y": 123456789}, maxDelta: 1e-10);
expect(solution, closeTo(123456789, 1e-10));
});
}); });
group('Native functions', () { group('Native functions', () {
@ -75,5 +90,4 @@ void main() {
expect(root, closeTo(Math.log(2), 0.01)); expect(root, closeTo(Math.log(2), 0.01));
}); });
}); });
} }