Решение кубического уравнения - Программа для нахождения корней кубического уравнения с действительными коэффициентами

ОГЛАВЛЕНИЕ

 

Программа для нахождения корней кубического уравнения с действительными коэффициентами

Ниже расположена программа для нахождения корней кубического уравнения с действительными коэффициентами.

/* Решение кубического уравнения. Случай с действительными коэффициентами.

int Cubic(double *x,double a,double b,double c);
Параметры:
x - массив решения (size 3).
На выходе:
3 действительных корня -> затем x ими заполняется;
1 действительный + 2 комплексных -> x[0] - действительный, x[1] действительная часть
комплексных корней, x[2] - неотрицательная мнимая часть.
a, b, c - коэффициенты
Результаты: 3 - 3 действительных корня;
1 - 1 действительный + 2 комплексных;
2 - 1 действительный корень + мнимая часть комплексных корней, если 0
(т.е. 2 действительных корня).
*/

#include <math.h> /* для sqrt(), fabs(), pow(), cos(), acos(). */
#define M_PI (3.141592653589793)
#define M_2PI (2.*M_PI)

int Cubic(double *x,double a,double b,double c) {
double q,r,r2,q3;
q=(a*a-3.*b)/9.; r=(a*(2.*a*a-9.*b)+27.*c)/54.;
r2=r*r; q3=q*q*q;
if(r2<q3) {
double t=acos(r/sqrt(q3));
a/=3.; q=-2.*sqrt(q);
x[0]=q*cos(t/3.)-a;
x[1]=q*cos((t+M_2PI)/3.)-a;
x[2]=q*cos((t-M_2PI)/3.)-a;
return(3);
}
else {
double aa,bb;
if(r<=0.) r=-r;
aa=-pow(r+sqrt(r2-q3),1./3.);
if(aa!=0.) bb=q/aa;
else bb=0.;
a/=3.; q=aa+bb; r=aa-bb;
x[0]=q-a;
x[1]=(-0.5)*q-a;
x[2]=(sqrt(3.)*0.5)*fabs(r);
if(x[2]==0.) return(2);
return(1);
}
}