190 lines
7.1 KiB
JavaScript
190 lines
7.1 KiB
JavaScript
defineSuite([
|
|
'Core/QuarticRealPolynomial',
|
|
'Core/Math'
|
|
], function(
|
|
QuarticRealPolynomial,
|
|
CesiumMath) {
|
|
'use strict';
|
|
|
|
it('discriminant throws without a', function() {
|
|
expect(function() {
|
|
QuarticRealPolynomial.computeDiscriminant();
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('discriminant throws without b', function() {
|
|
expect(function() {
|
|
QuarticRealPolynomial.computeDiscriminant(1.0);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('discriminant throws without c', function() {
|
|
expect(function() {
|
|
QuarticRealPolynomial.computeDiscriminant(1.0, 1.0);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('discriminant throws without d', function() {
|
|
expect(function() {
|
|
QuarticRealPolynomial.computeDiscriminant(1.0, 1.0, 1.0);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('discriminant throws without e', function() {
|
|
expect(function() {
|
|
QuarticRealPolynomial.computeDiscriminant(1.0, 1.0, 1.0, 1.0);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('discriminant', function() {
|
|
var a = 1;
|
|
var b = 2;
|
|
var c = 3;
|
|
var d = 4;
|
|
var e = 5;
|
|
|
|
var a2 = a * a;
|
|
var a3 = a2 * a;
|
|
var b2 = b * b;
|
|
var b3 = b2 * b;
|
|
var c2 = c * c;
|
|
var c3 = c2 * c;
|
|
var d2 = d * d;
|
|
var d3 = d2 * d;
|
|
var e2 = e * e;
|
|
var e3 = e2 * e;
|
|
|
|
var expected = b2 * c2 * d2 - 4.0 * b3 * d3 - 4.0 * a * c3 * d2 + 18 * a * b * c * d3 - 27.0 * a2 * d2 * d2 + 256.0 * a3 * e3 + e * (18.0 * b3 * c * d - 4.0 * b2 * c3 + 16.0 * a * c2 * c2 - 80.0 * a * b * c2 * d - 6.0 * a * b2 * d2 + 144.0 * a2 * c * d2) + e2 * (144.0 * a * b2 * c - 27.0 * b2 * b2 - 128.0 * a2 * c2 - 192.0 * a2 * b * d);
|
|
var actual = QuarticRealPolynomial.computeDiscriminant(a, b, c, d, e);
|
|
expect(actual).toEqual(expected);
|
|
});
|
|
|
|
it('real roots throws without a', function() {
|
|
expect(function() {
|
|
QuarticRealPolynomial.computeRealRoots();
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('real roots throws without b', function() {
|
|
expect(function() {
|
|
QuarticRealPolynomial.computeRealRoots(1.0);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('real roots throws without c', function() {
|
|
expect(function() {
|
|
QuarticRealPolynomial.computeRealRoots(1.0, 1.0);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('real roots throws without d', function() {
|
|
expect(function() {
|
|
QuarticRealPolynomial.computeRealRoots(1.0, 1.0, 1.0);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('real roots throws without e', function() {
|
|
expect(function() {
|
|
QuarticRealPolynomial.computeRealRoots(1.0, 1.0, 1.0, 1.0);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('four repeated roots', function() {
|
|
var roots = QuarticRealPolynomial.computeRealRoots(2.0, -16.0, 48.0, -64.0, 32.0);
|
|
expect(roots.length).toEqual(4);
|
|
expect(roots[0]).toEqualEpsilon(2.0, CesiumMath.EPSILON15);
|
|
expect(roots[1]).toEqualEpsilon(2.0, CesiumMath.EPSILON15);
|
|
expect(roots[2]).toEqualEpsilon(2.0, CesiumMath.EPSILON15);
|
|
expect(roots[3]).toEqualEpsilon(2.0, CesiumMath.EPSILON15);
|
|
});
|
|
|
|
it('two pairs of repeated roots', function() {
|
|
var roots = QuarticRealPolynomial.computeRealRoots(2.0, 0.0, -4.0, 0.0, 2.0);
|
|
expect(roots.length).toEqual(4);
|
|
expect(roots[0]).toEqualEpsilon(-1.0, CesiumMath.EPSILON15);
|
|
expect(roots[1]).toEqualEpsilon(-1.0, CesiumMath.EPSILON15);
|
|
expect(roots[2]).toEqualEpsilon(1.0, CesiumMath.EPSILON15);
|
|
expect(roots[3]).toEqualEpsilon(1.0, CesiumMath.EPSILON15);
|
|
});
|
|
|
|
it('one pair of repeated roots', function() {
|
|
var roots = QuarticRealPolynomial.computeRealRoots(2.0, -8.0, 16.0, -16.0, 6.0);
|
|
expect(roots.length).toEqual(2);
|
|
expect(roots[0]).toEqualEpsilon(1.0, CesiumMath.EPSILON14);
|
|
expect(roots[1]).toEqualEpsilon(1.0, CesiumMath.EPSILON14);
|
|
});
|
|
|
|
it('two unique and one pair of repeated roots', function() {
|
|
var roots = QuarticRealPolynomial.computeRealRoots(2.0, 8.0, -6.0, -20.0, 16.0);
|
|
expect(roots.length).toEqual(4);
|
|
expect(roots[0]).toEqualEpsilon(-4.0, CesiumMath.EPSILON15);
|
|
expect(roots[1]).toEqualEpsilon(-2.0, CesiumMath.EPSILON15);
|
|
expect(roots[2]).toEqualEpsilon(1.0, CesiumMath.EPSILON15);
|
|
expect(roots[3]).toEqualEpsilon(1.0, CesiumMath.EPSILON15);
|
|
});
|
|
|
|
it('four unique roots', function() {
|
|
var roots = QuarticRealPolynomial.computeRealRoots(2.0, 4.0, -26.0, -28.0, 48.0);
|
|
expect(roots.length).toEqual(4);
|
|
expect(roots[0]).toEqualEpsilon(-4.0, CesiumMath.EPSILON15);
|
|
expect(roots[1]).toEqualEpsilon(-2.0, CesiumMath.EPSILON15);
|
|
expect(roots[2]).toEqualEpsilon(1.0, CesiumMath.EPSILON15);
|
|
expect(roots[3]).toEqualEpsilon(3.0, CesiumMath.EPSILON15);
|
|
});
|
|
|
|
it('complex roots', function() {
|
|
var roots = QuarticRealPolynomial.computeRealRoots(3.0, -8.0, 14.0, -8.0, 3.0);
|
|
expect(roots.length).toEqual(0);
|
|
});
|
|
|
|
it('cubic case', function() {
|
|
var roots = QuarticRealPolynomial.computeRealRoots(0.0, 2.0, 6.0, -26.0, -30.0);
|
|
expect(roots.length).toEqual(3);
|
|
expect(roots[0]).toEqualEpsilon(-5.0, CesiumMath.EPSILON15);
|
|
expect(roots[1]).toEqualEpsilon(-1.0, CesiumMath.EPSILON15);
|
|
expect(roots[2]).toEqualEpsilon(3.0, CesiumMath.EPSILON15);
|
|
});
|
|
|
|
it('stability 1', function() {
|
|
var a = 1.0;
|
|
var b = -27121.309311434146;
|
|
var c = 0.0;
|
|
var d = -26760.571078686513;
|
|
var e = -1.0;
|
|
|
|
var expected = [ -0.000037368410630733706, 27121.3093478151];
|
|
var actual = QuarticRealPolynomial.computeRealRoots(a, b, c, d, e);
|
|
expect(actual.length).toEqual(expected.length);
|
|
expect(actual[0]).toEqualEpsilon(expected[0], CesiumMath.EPSILON12);
|
|
expect(actual[1]).toEqualEpsilon(expected[1], CesiumMath.EPSILON12);
|
|
});
|
|
|
|
it('stability 2', function() {
|
|
var a = -1.0;
|
|
var b = -26959.661445199898;
|
|
var c = 0.0;
|
|
var d = -26675.609408851604;
|
|
var e = 1.0;
|
|
|
|
var expected = [ -26959.661481901538, 0.000037487427107407711 ];
|
|
var actual = QuarticRealPolynomial.computeRealRoots(a, b, c, d, e);
|
|
expect(actual.length).toEqual(expected.length);
|
|
expect(actual[0]).toEqualEpsilon(expected[0], CesiumMath.EPSILON11);
|
|
expect(actual[1]).toEqualEpsilon(expected[1], CesiumMath.EPSILON11);
|
|
});
|
|
|
|
it('stability 3', function() {
|
|
var a = -1.0;
|
|
var b = 20607.270539372261;
|
|
var c = 0.0;
|
|
var d = 20333.159863900513;
|
|
var e = 1.0;
|
|
|
|
var expected = [ -0.000049180747737409547, 20607.270587253341 ];
|
|
var actual = QuarticRealPolynomial.computeRealRoots(a, b, c, d, e);
|
|
expect(actual.length).toEqual(expected.length);
|
|
expect(actual[0]).toEqualEpsilon(expected[0], CesiumMath.EPSILON11);
|
|
expect(actual[1]).toEqualEpsilon(expected[1], CesiumMath.EPSILON11);
|
|
});
|
|
});
|