You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
246 lines
7.0 KiB
JavaScript
246 lines
7.0 KiB
JavaScript
import { Math as CesiumMath } from "../../Source/Cesium.js";
|
|
import { QuarticRealPolynomial } from "../../Source/Cesium.js";
|
|
|
|
describe("Core/QuarticRealPolynomial", function () {
|
|
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);
|
|
});
|
|
});
|