You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Jay van Bruggen <ja...@upcmail.nl.INVALID> on 2024/12/15 19:53:15 UTC
Apache Math 3.6 and 4 return wrong values using FiniteDifferencesDifferentiator
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));
}
Re: Apache Math 3.6 and 4 return wrong values using FiniteDifferencesDifferentiator
Posted by Jay van Bruggen <ja...@upcmail.nl.INVALID>.
allow me to add one more code for demonstration :
import org.apache.commons.math3.analysis.UnivariateFunction;
import org.apache.commons.math3.analysis.differentiation.FiniteDifferencesDifferentiator;
import org.apache.commons.math3.analysis.polynomials.PolynomialFunction;
//hier kwam Claude mee om de numerieke differentiatie te testen. Het is
nog steeds fout public class dif2 {
public static void main(String[] args) {
// Our function f(x) = 2x³ - 3x² + 4x - 1 UnivariateFunction f =new UnivariateFunction() {
@Override public double value(double x) {
return 15 * Math.pow(x,2) -3 * x;
}
};
// Test different step sizes and number of points double x_eval =10.0;
System.out.println("Testing numerical differentiation at x = " + x_eval);
System.out.println("Expected value: 16.0");
System.out.println("\nVarying step sizes with 5 points:");
double[] stepSizes = {1.0,0.1,0.01,0.001,0.0001};
for (double stepSize : stepSizes) {
FiniteDifferencesDifferentiator diff =new FiniteDifferencesDifferentiator(5, stepSize);
UnivariateFunction derivative = diff.differentiate(f);
System.out.printf("Step size: %.6f -> Result: %.6f%n",
stepSize, derivative.value(x_eval));
}
System.out.println("\nVarying number of points with step size 0.01:");
int[] numPoints = {3,5,7,9,11};
for (int points : numPoints) {
FiniteDifferencesDifferentiator diff =new FiniteDifferencesDifferentiator(points,0.01);
UnivariateFunction derivative = diff.differentiate(f);
System.out.printf("Number of points: %d -> Result: %.6f%n",
points, derivative.value(x_eval));
}
// Verify exact solution double[] coefficients = {0,3,15,};
PolynomialFunction polynomial =new PolynomialFunction(coefficients);
PolynomialFunction derivative = polynomial.polynomialDerivative();
System.out.printf("%nExact derivative value: %.6f%n", derivative.value(x_eval));
}
}
On 15/12/2024 20:53, Jay van Bruggen wrote:
>
>
> 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));
> }
>
>
>
>
>
>
Re: Apache Math 3.6 and 4 return wrong values using FiniteDifferencesDifferentiator
Posted by Gilles Sadowski <gi...@gmail.com>.
Hi.
It's great to have reported here. But it would indeed be easier to follow up
in the bug tracking system.
Better than included in the email below would be to add JUnit tests to the
appropriate source files (under the "sr/test" directory), and upload the "diff"
to the JIRA ticket page.
Thanks,
Gilles
Le lun. 16 déc. 2024 à 00:01, Jay van Bruggen
<ja...@upcmail.nl.invalid> a écrit :
>
>
> 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));
> }
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org