Browse Source

polynomial: more 3rd order fixes

undefined
Guillaume Bittoun Sam Hocevar <sam@hocevar.net> 9 years ago
parent
commit
1c93dabbad
2 changed files with 12 additions and 7 deletions
  1. +10
    -5
      src/lol/math/polynomial.h
  2. +2
    -2
      src/t/math/polynomial.cpp

+ 10
- 5
src/lol/math/polynomial.h View File

@@ -20,7 +20,10 @@


#include <functional> #include <functional>


#if 1
// #define ENABLE_3SOLVE
// #include <iostream>

#ifdef ENABLE_3SOLVE
#include <complex> #include <complex>
#endif #endif


@@ -169,7 +172,7 @@ struct polynomial
/* Using x = (X - k) so that p2(X) = p(X - k) = aX³ + 0×X² + mX + n */ /* Using x = (X - k) so that p2(X) = p(X - k) = aX³ + 0×X² + mX + n */
T const k = b / (3 * a); T const k = b / (3 * a);
T const m = 3 * a * k * k - 2 * b * k + c; T const m = 3 * a * k * k - 2 * b * k + c;
T const n = -a * k * k * k + b * k * k + c * k + d;
T const n = -a * k * k * k + b * k * k - c * k + d;


std::cout << "k,m,n: " << k << ", " << m << ", " << n << std::endl; std::cout << "k,m,n: " << k << ", " << m << ", " << n << std::endl;


@@ -184,8 +187,8 @@ struct polynomial
* u³ - v³ = √((n/a)² + 4m³/27) * u³ - v³ = √((n/a)² + 4m³/27)
* u³ + v³ = -n/a * u³ + v³ = -n/a
* *
* u³ = -n/2a + √((n/a)² + 4m³/27)/2
* v³ = -n/2a - √((n/a)² + 4m³/27)/2
* u³ = (-n/a + √((n/a)² + 4m³/27))/2
* v³ = (-n/a - √((n/a)² + 4m³/27))/2
*/ */
T const delta = (n * n) / (a * a) + 4 * m * m * m / 27; T const delta = (n * n) / (a * a) + 4 * m * m * m / 27;


@@ -229,9 +232,11 @@ struct polynomial
pow(v3_norm, 1.f / 3.f) * std::complex<T>(cos(v_angle), sin(v_angle)); pow(v3_norm, 1.f / 3.f) * std::complex<T>(cos(v_angle), sin(v_angle));
} }


std::cout << "delta: " << delta << std::endl;

std::cout << "complex_solutions: " << complex_solutions[0] << ", " << complex_solutions[1] << ", " << complex_solutions[2] << std::endl; std::cout << "complex_solutions: " << complex_solutions[0] << ", " << complex_solutions[1] << ", " << complex_solutions[2] << std::endl;


return array<T> {complex_solutions[0].real(), complex_solutions[1].real(), complex_solutions[2].real()};
return array<T> {complex_solutions[0].real() - k, complex_solutions[1].real() - k, complex_solutions[2].real() - k};
} }
#endif #endif




+ 2
- 2
src/t/math/polynomial.cpp View File

@@ -275,7 +275,7 @@ lolunit_declare_fixture(PolynomialTest)
#ifdef ENABLE_3SOLVE // Development in progress #ifdef ENABLE_3SOLVE // Development in progress
lolunit_declare_test(RootsDegree3) lolunit_declare_test(RootsDegree3)
{ {
polynomial<float> p { 2.f, 0.f, 0.f, 1.f };
polynomial<float> p { 1.f, 0.f, 0.f, 1.f };
auto roots1 = p.roots(); auto roots1 = p.roots();


lolunit_assert_equal(roots1.count(), 3); lolunit_assert_equal(roots1.count(), 3);
@@ -285,7 +285,7 @@ lolunit_declare_fixture(PolynomialTest)


lolunit_declare_test(RootsDegree3_2) lolunit_declare_test(RootsDegree3_2)
{ {
polynomial<float> p { -1.f, 0.f, 0.f, 1.f };
polynomial<float> p { 0.f, -2.f, 0.f, 1.f };
auto roots1 = p.roots(); auto roots1 = p.roots();


lolunit_assert_equal(roots1.count(), 3); lolunit_assert_equal(roots1.count(), 3);


Loading…
Cancel
Save