MATH-683
New method "shift" to compute coefficients of a polynomial (due to R. di Costanzo). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1179671 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
61018c7997
commit
23da497319
|
@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||||
|
|
||||||
import org.apache.commons.math.fraction.BigFraction;
|
import org.apache.commons.math.fraction.BigFraction;
|
||||||
import org.apache.commons.math.util.FastMath;
|
import org.apache.commons.math.util.FastMath;
|
||||||
|
import org.apache.commons.math.util.MathUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A collection of static methods that operate on or return polynomials.
|
* A collection of static methods that operate on or return polynomials.
|
||||||
|
@ -184,6 +185,61 @@ public class PolynomialsUtils {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the coefficients of the polynomial <code>P<sub>s</sub>(x)</code>
|
||||||
|
* whose values at point {@code x} will be the same as the those from the
|
||||||
|
* original polynomial <code>P(x)</code> when computed at {@code x + shift}.
|
||||||
|
* Thus, if <code>P(x) = Σ<sub>i</sub> a<sub>i</sub> x<sup>i</sup></code>,
|
||||||
|
* then
|
||||||
|
* <pre>
|
||||||
|
* <table>
|
||||||
|
* <tr>
|
||||||
|
* <td><code>P<sub>s</sub>(x)</td>
|
||||||
|
* <td>= Σ<sub>i</sub> b<sub>i</sub> x<sup>i</sup></code></td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td></td>
|
||||||
|
* <td>= Σ<sub>i</sub> a<sub>i</sub> (x + shift)<sup>i</sup></code></td>
|
||||||
|
* </tr>
|
||||||
|
* </table>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @param coefficients Coefficients of the original polynomial.
|
||||||
|
* @param shift Shift value.
|
||||||
|
* @return the coefficients <code>b<sub>i</sub></code> of the shifted
|
||||||
|
* polynomial.
|
||||||
|
*/
|
||||||
|
public static double[] shift(final double[] coefficients,
|
||||||
|
final double shift) {
|
||||||
|
final int dp1 = coefficients.length;
|
||||||
|
final double[] newCoefficients = new double[dp1];
|
||||||
|
|
||||||
|
// Pascal triangle.
|
||||||
|
final int[][] coeff = new int[dp1][dp1];
|
||||||
|
for (int i = 0; i < dp1; i++){
|
||||||
|
for(int j = 0; j <= i; j++){
|
||||||
|
coeff[i][j] = (int) MathUtils.binomialCoefficient(i, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// First polynomial coefficient.
|
||||||
|
for (int i = 0; i < dp1; i++){
|
||||||
|
newCoefficients[0] += coefficients[i] * FastMath.pow(shift, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Superior order.
|
||||||
|
final int d = dp1 - 1;
|
||||||
|
for (int i = 0; i < d; i++) {
|
||||||
|
for (int j = i; j < d; j++){
|
||||||
|
newCoefficients[i + 1] += coeff[j + 1][j - i] *
|
||||||
|
coefficients[j + 1] * FastMath.pow(shift, j - i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newCoefficients;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Get the coefficients array for a given degree.
|
/** Get the coefficients array for a given degree.
|
||||||
* @param degree degree of the polynomial
|
* @param degree degree of the polynomial
|
||||||
* @param coefficients list where the computed coefficients are stored
|
* @param coefficients list where the computed coefficients are stored
|
||||||
|
|
|
@ -52,6 +52,11 @@ The <action> type attribute can be add,update,fix,remove.
|
||||||
If the output is not quite correct, check for invisible trailing spaces!
|
If the output is not quite correct, check for invisible trailing spaces!
|
||||||
-->
|
-->
|
||||||
<release version="3.0" date="TBD" description="TBD">
|
<release version="3.0" date="TBD" description="TBD">
|
||||||
|
<action dev="erans" type="add" issue="MATH-683" due-to="Romain di Costanzo">
|
||||||
|
Added "shift" method to compute the coefficients of a new polynomial
|
||||||
|
whose values are the same as those of another polynomial but computed
|
||||||
|
at a shifted point.
|
||||||
|
</action>
|
||||||
<action dev="erans" type="fix" issue="MATH-676">
|
<action dev="erans" type="fix" issue="MATH-676">
|
||||||
Faster "multiply" method in "Array2DRowRealMatrix". Code inspired
|
Faster "multiply" method in "Array2DRowRealMatrix". Code inspired
|
||||||
from the Jama project.
|
from the Jama project.
|
||||||
|
|
|
@ -207,6 +207,36 @@ public class PolynomialsUtilsTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testShift(){
|
||||||
|
// f1(x) = 1 + x + 2 x^2
|
||||||
|
PolynomialFunction f1x = new PolynomialFunction(new double[] { 1, 1, 2 });
|
||||||
|
|
||||||
|
PolynomialFunction f1x1
|
||||||
|
= new PolynomialFunction(PolynomialsUtils.shift(f1x.getCoefficients(), 1));
|
||||||
|
checkPolynomial(f1x1, "4 + 5 x + 2 x^2");
|
||||||
|
|
||||||
|
PolynomialFunction f1xM1
|
||||||
|
= new PolynomialFunction(PolynomialsUtils.shift(f1x.getCoefficients(), -1));
|
||||||
|
checkPolynomial(f1xM1, "2 - 3 x + 2 x^2");
|
||||||
|
|
||||||
|
PolynomialFunction f1x3
|
||||||
|
= new PolynomialFunction(PolynomialsUtils.shift(f1x.getCoefficients(), 3));
|
||||||
|
checkPolynomial(f1x3, "22 + 13 x + 2 x^2");
|
||||||
|
|
||||||
|
// f2(x) = 2 + 3 x^2 + 8 x^3 + 121 x^5
|
||||||
|
PolynomialFunction f2x = new PolynomialFunction(new double[]{2, 0, 3, 8, 0, 121});
|
||||||
|
|
||||||
|
PolynomialFunction f2x1
|
||||||
|
= new PolynomialFunction(PolynomialsUtils.shift(f2x.getCoefficients(), 1));
|
||||||
|
checkPolynomial(f2x1, "134 + 635 x + 1237 x^2 + 1218 x^3 + 605 x^4 + 121 x^5");
|
||||||
|
|
||||||
|
PolynomialFunction f2x3
|
||||||
|
= new PolynomialFunction(PolynomialsUtils.shift(f2x.getCoefficients(), 3));
|
||||||
|
checkPolynomial(f2x3, "29648 + 49239 x + 32745 x^2 + 10898 x^3 + 1815 x^4 + 121 x^5");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void checkPolynomial(PolynomialFunction p, long denominator, String reference) {
|
private void checkPolynomial(PolynomialFunction p, long denominator, String reference) {
|
||||||
PolynomialFunction q = new PolynomialFunction(new double[] { denominator});
|
PolynomialFunction q = new PolynomialFunction(new double[] { denominator});
|
||||||
Assert.assertEquals(reference, p.multiply(q).toString());
|
Assert.assertEquals(reference, p.multiply(q).toString());
|
||||||
|
|
Loading…
Reference in New Issue