85 T D = std::pow( c, 2 ) - 4.0 * b * d;
92 X( 0 ) = ( -c - D ) / ( 2.0 * b );
93 X( 1 ) = ( -c + D ) / ( 2.0 * b );
100 X( 0 ) = -c / ( 2.0 * b );
111 T p = ( 9.0*a*c-3.0*std::pow( b,2) )/(9.0*std::pow( a, 2 ));
112 T
q = ( 2.0* std::pow( b, 3) - 9.0*a*b*c + 27.0*std::pow(a,2)*d)/(27.0*std::pow( a,3 ));
114 T D = 0.25 * std::pow(
q, 2 ) + std::pow( p, 3)/27.0;
119 T u = -0.5*
q + std::sqrt( D );
120 T v = -0.5*
q - std::sqrt( D );
121 u =
sign( u )*std::pow( std::abs( u ), 1.0/3.0 );
122 v =
sign( v )*std::pow( std::abs( v ), 1.0/3.0 );
128 std::complex< T > x = u + v;
132 X( 0 ) = std::real( x ) - r;
136 const std::complex< T > f1( -0.5, 0.5 * std::sqrt( 3.0 ));
137 const std::complex< T > f2( -0.5, -0.5 * std::sqrt( 3.0 ));
142 X( 0 ) = std::real( x ) - r;
149 X( 0 ) = std::real( x ) - r;
153 BELFEM_ERROR(
false,
"Something went wrong while trying to solve cubic equation" );
160 std::complex< T > u = std::sqrt( -4.0/3.0*p );
161 std::complex< T > v = std::acos( -0.5*
q*std::sqrt( -27.0/std::pow( p, 3 ) ) )/3.0;
162 const std::complex< T > w = 2.0*std::acos( 0.0 )/3.0;
165 X( 0 ) = std::real( u * std::cos( v ) ) -r;
166 X( 1 ) = std::real( -u * std::cos( v + w ) ) -r;
167 X( 2 ) = std::real( -u * std::cos( v - w ) ) -r;
183 X( 0 ) = -3.0 *
q / ( 2.0 * p ) - r;
184 X( 1 ) = 3.0 *
q / p - r;
void cardano(const T a, const T b, const T c, const T d, Vector< T > &X)
solve a cubic equation a*x^3 + b*x^2 + c*x + d = 0 for its real roots (Cardano / trigonometric method...
Definition fn_cardano.hpp:66