You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Luc Maisonobe (JIRA)" <ji...@apache.org> on 2009/11/06 16:10:32 UTC
[jira] Created: (MATH-318) wrong result in eigen decomposition
wrong result in eigen decomposition
-----------------------------------
Key: MATH-318
URL: https://issues.apache.org/jira/browse/MATH-318
Project: Commons Math
Issue Type: Bug
Affects Versions: 2.0
Reporter: Luc Maisonobe
Fix For: 2.1
Some results computed by EigenDecompositionImpl are wrong. The following case computed by Fortran Lapack fails with version 2.0
{code}
public void testMathpbx02() {
double[] mainTridiagonal = {
7484.860960227216, 18405.28129035345, 13855.225609560746,
10016.708722343366, 559.8117399576674, 6750.190788301587,
71.21428769782159
};
double[] secondaryTridiagonal = {
-4175.088570476366,1975.7955858241994,5193.178422374075,
1995.286659169179,75.34535882933804,-234.0808002076056
};
// the reference values have been computed using routine DSTEMR
// from the fortran library LAPACK version 3.2.1
double[] refEigenValues = {
20654.744890306974412,16828.208208485466457,
6893.155912634994820,6757.083016675340332,
5887.799885688558788,64.309089923240379,
57.992628792736340
};
RealVector[] refEigenVectors = {
new ArrayRealVector(new double[] {-0.270356342026904, 0.852811091326997, 0.399639490702077, 0.198794657813990, 0.019739323307666, 0.000106983022327, -0.000001216636321}),
new ArrayRealVector(new double[] {0.179995273578326,-0.402807848153042,0.701870993525734,0.555058211014888,0.068079148898236,0.000509139115227,-0.000007112235617}),
new ArrayRealVector(new double[] {-0.399582721284727,-0.056629954519333,-0.514406488522827,0.711168164518580,0.225548081276367,0.125943999652923,-0.004321507456014}),
new ArrayRealVector(new double[] {0.058515721572821,0.010200130057739,0.063516274916536,-0.090696087449378,-0.017148420432597,0.991318870265707,-0.034707338554096}),
new ArrayRealVector(new double[] {0.855205995537564,0.327134656629775,-0.265382397060548,0.282690729026706,0.105736068025572,-0.009138126622039,0.000367751821196}),
new ArrayRealVector(new double[] {-0.002913069901144,-0.005177515777101,0.041906334478672,-0.109315918416258,0.436192305456741,0.026307315639535,0.891797507436344}),
new ArrayRealVector(new double[] {-0.005738311176435,-0.010207611670378,0.082662420517928,-0.215733886094368,0.861606487840411,-0.025478530652759,-0.451080697503958})
};
// the following line triggers the exception
EigenDecomposition decomposition =
new EigenDecompositionImpl(mainTridiagonal, secondaryTridiagonal, MathUtils.SAFE_MIN);
double[] eigenValues = decomposition.getRealEigenvalues();
for (int i = 0; i < refEigenValues.length; ++i) {
assertEquals(refEigenValues[i], eigenValues[i], 1.0e-3);
if (refEigenVectors[i].dotProduct(decomposition.getEigenvector(i)) < 0) {
assertEquals(0, refEigenVectors[i].add(decomposition.getEigenvector(i)).getNorm(), 1.0e-5);
} else {
assertEquals(0, refEigenVectors[i].subtract(decomposition.getEigenvector(i)).getNorm(), 1.0e-5);
}
}
}
{code}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Resolved: (MATH-318) wrong result in eigen decomposition
Posted by "Luc Maisonobe (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/MATH-318?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Luc Maisonobe resolved MATH-318.
--------------------------------
Resolution: Fixed
fixed in subversion repository as of r833433.
Thanks again to Dimitri would found and fixed this bug.
> wrong result in eigen decomposition
> -----------------------------------
>
> Key: MATH-318
> URL: https://issues.apache.org/jira/browse/MATH-318
> Project: Commons Math
> Issue Type: Bug
> Affects Versions: 2.0
> Reporter: Luc Maisonobe
> Fix For: 2.1
>
>
> Some results computed by EigenDecompositionImpl are wrong. The following case computed by Fortran Lapack fails with version 2.0
> {code}
> public void testMathpbx02() {
> double[] mainTridiagonal = {
> 7484.860960227216, 18405.28129035345, 13855.225609560746,
> 10016.708722343366, 559.8117399576674, 6750.190788301587,
> 71.21428769782159
> };
> double[] secondaryTridiagonal = {
> -4175.088570476366,1975.7955858241994,5193.178422374075,
> 1995.286659169179,75.34535882933804,-234.0808002076056
> };
> // the reference values have been computed using routine DSTEMR
> // from the fortran library LAPACK version 3.2.1
> double[] refEigenValues = {
> 20654.744890306974412,16828.208208485466457,
> 6893.155912634994820,6757.083016675340332,
> 5887.799885688558788,64.309089923240379,
> 57.992628792736340
> };
> RealVector[] refEigenVectors = {
> new ArrayRealVector(new double[] {-0.270356342026904, 0.852811091326997, 0.399639490702077, 0.198794657813990, 0.019739323307666, 0.000106983022327, -0.000001216636321}),
> new ArrayRealVector(new double[] {0.179995273578326,-0.402807848153042,0.701870993525734,0.555058211014888,0.068079148898236,0.000509139115227,-0.000007112235617}),
> new ArrayRealVector(new double[] {-0.399582721284727,-0.056629954519333,-0.514406488522827,0.711168164518580,0.225548081276367,0.125943999652923,-0.004321507456014}),
> new ArrayRealVector(new double[] {0.058515721572821,0.010200130057739,0.063516274916536,-0.090696087449378,-0.017148420432597,0.991318870265707,-0.034707338554096}),
> new ArrayRealVector(new double[] {0.855205995537564,0.327134656629775,-0.265382397060548,0.282690729026706,0.105736068025572,-0.009138126622039,0.000367751821196}),
> new ArrayRealVector(new double[] {-0.002913069901144,-0.005177515777101,0.041906334478672,-0.109315918416258,0.436192305456741,0.026307315639535,0.891797507436344}),
> new ArrayRealVector(new double[] {-0.005738311176435,-0.010207611670378,0.082662420517928,-0.215733886094368,0.861606487840411,-0.025478530652759,-0.451080697503958})
> };
> // the following line triggers the exception
> EigenDecomposition decomposition =
> new EigenDecompositionImpl(mainTridiagonal, secondaryTridiagonal, MathUtils.SAFE_MIN);
> double[] eigenValues = decomposition.getRealEigenvalues();
> for (int i = 0; i < refEigenValues.length; ++i) {
> assertEquals(refEigenValues[i], eigenValues[i], 1.0e-3);
> if (refEigenVectors[i].dotProduct(decomposition.getEigenvector(i)) < 0) {
> assertEquals(0, refEigenVectors[i].add(decomposition.getEigenvector(i)).getNorm(), 1.0e-5);
> } else {
> assertEquals(0, refEigenVectors[i].subtract(decomposition.getEigenvector(i)).getNorm(), 1.0e-5);
> }
> }
> }
> {code}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Closed: (MATH-318) wrong result in eigen decomposition
Posted by "Phil Steitz (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/MATH-318?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Phil Steitz closed MATH-318.
----------------------------
> wrong result in eigen decomposition
> -----------------------------------
>
> Key: MATH-318
> URL: https://issues.apache.org/jira/browse/MATH-318
> Project: Commons Math
> Issue Type: Bug
> Affects Versions: 2.0
> Reporter: Luc Maisonobe
> Fix For: 2.1
>
>
> Some results computed by EigenDecompositionImpl are wrong. The following case computed by Fortran Lapack fails with version 2.0
> {code}
> public void testMathpbx02() {
> double[] mainTridiagonal = {
> 7484.860960227216, 18405.28129035345, 13855.225609560746,
> 10016.708722343366, 559.8117399576674, 6750.190788301587,
> 71.21428769782159
> };
> double[] secondaryTridiagonal = {
> -4175.088570476366,1975.7955858241994,5193.178422374075,
> 1995.286659169179,75.34535882933804,-234.0808002076056
> };
> // the reference values have been computed using routine DSTEMR
> // from the fortran library LAPACK version 3.2.1
> double[] refEigenValues = {
> 20654.744890306974412,16828.208208485466457,
> 6893.155912634994820,6757.083016675340332,
> 5887.799885688558788,64.309089923240379,
> 57.992628792736340
> };
> RealVector[] refEigenVectors = {
> new ArrayRealVector(new double[] {-0.270356342026904, 0.852811091326997, 0.399639490702077, 0.198794657813990, 0.019739323307666, 0.000106983022327, -0.000001216636321}),
> new ArrayRealVector(new double[] {0.179995273578326,-0.402807848153042,0.701870993525734,0.555058211014888,0.068079148898236,0.000509139115227,-0.000007112235617}),
> new ArrayRealVector(new double[] {-0.399582721284727,-0.056629954519333,-0.514406488522827,0.711168164518580,0.225548081276367,0.125943999652923,-0.004321507456014}),
> new ArrayRealVector(new double[] {0.058515721572821,0.010200130057739,0.063516274916536,-0.090696087449378,-0.017148420432597,0.991318870265707,-0.034707338554096}),
> new ArrayRealVector(new double[] {0.855205995537564,0.327134656629775,-0.265382397060548,0.282690729026706,0.105736068025572,-0.009138126622039,0.000367751821196}),
> new ArrayRealVector(new double[] {-0.002913069901144,-0.005177515777101,0.041906334478672,-0.109315918416258,0.436192305456741,0.026307315639535,0.891797507436344}),
> new ArrayRealVector(new double[] {-0.005738311176435,-0.010207611670378,0.082662420517928,-0.215733886094368,0.861606487840411,-0.025478530652759,-0.451080697503958})
> };
> // the following line triggers the exception
> EigenDecomposition decomposition =
> new EigenDecompositionImpl(mainTridiagonal, secondaryTridiagonal, MathUtils.SAFE_MIN);
> double[] eigenValues = decomposition.getRealEigenvalues();
> for (int i = 0; i < refEigenValues.length; ++i) {
> assertEquals(refEigenValues[i], eigenValues[i], 1.0e-3);
> if (refEigenVectors[i].dotProduct(decomposition.getEigenvector(i)) < 0) {
> assertEquals(0, refEigenVectors[i].add(decomposition.getEigenvector(i)).getNorm(), 1.0e-5);
> } else {
> assertEquals(0, refEigenVectors[i].subtract(decomposition.getEigenvector(i)).getNorm(), 1.0e-5);
> }
> }
> }
> {code}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.