Hi, I have used Apache math a lot lately,
to my great satisfaction.
However,
Using FiniteDifferencesDifferentiator, In both 3.6 and 4.0 I have tried
and compared the
Numerical Differentiation methods, using functions I can differentiate
by hand for control.
For 2 simple functions , I get wrong values returned.
the first derivative of the function
f(x) = 2x^3 - 3x^2 + 4x - 1
f' = 6x^2 -6x + 4
should return 16 in x=2 .
Apache always returns 11 , I have tried many different parameter
settings. That's wrong.
Lowering the bar ,
the function
f(x) = 15x^2 + 3x
f'() = 30x+3
should return 303.
It returns 1530 which is very wrong.
something seems quite wrong off in the FiniteDifferencesDifferentiator.
I could always be mistaken , but everything compiles, and I have
checked many times.
If I am wrong I apologize, but I should at least mention this.
Below is two implementations I did using mentioned functions.
I've tried several approaches and i have used many other Apache math
methods like integration and curvefitting before,
But I cannot get this one to work, It's pretty serious if it returns
something wrong.
I have a hard time finding the right entrance for this bug report, doI
have really to create a Jira account?
What can I do to get in contact to report this problem, if this is not
the right way?
Greets,
Jay van Bruggen
Java 17 , IntelliJ pro 2024.3 Windows 10.
// Import statements import
org.apache.commons.math3.analysis.UnivariateFunction;
import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
import
org.apache.commons.math3.analysis.differentiation.FiniteDifferencesDifferentiator;
public class chatdiff {
public static void main(String[] args) {
// Define the function f(x) = 2x^3 - 3x^2 + 4x - 1 UnivariateFunction
function = x ->2 * Math.pow(x,3) -3 * Math.pow(x,2) +4 * x -1;
// Create a finite differences differentiator // The first argument is
the number of points for interpolation; the second is the range size FiniteDifferencesDifferentiator differentiator =new FiniteDifferencesDifferentiator(5,0.01);
// Differentiate the function UnivariateFunction derivative =
differentiator.differentiate(function);
// Evaluate the first derivative at x = 2 double x =2.0;
double derivativeAtX = derivative.value(x);
// Print the result System.out.println("The derivative of f(x) at x = " + x
+" is approximately: " + derivativeAtX);
}
}
// Numerical differentiation using finite differences
System.out.println("\nNumerical Differentiation using Finite Differences:");
UnivariateFunction f =new UnivariateFunction() {
@Override public double value(double x) {
return 15 * Math.pow(x,2) +3 * x;
}
};
FiniteDifferencesDifferentiator differentiator =new
FiniteDifferencesDifferentiator(5,0.25);
UnivariateFunction derivative_numerical = differentiator.differentiate(f);
// Compare results at x = 2 double x_eval =10.0;
System.out.println("Numerical derivative at x = " + x_eval +": " +
derivative_numerical.value(x_eval));
System.out.println("Exact derivative at x = " + x_eval +": " +
derivative.value(x_eval));
}