Multi-class equation

xiaoxiao2021-03-06  15

//2005.3 Hangzhou

#ifndef polyequation_header

#define polyequation_header

#include

#include

#include

#include

#define maxResult 1e10

#define minResult -1e10

#define EPSILON 1E-6

Using namespace std;

Template

Class Polyequation

{

PUBLIC:

Polyequation (int _n): n (_n)

{

Coe.Rserve (N 1);

}

Template

Polyequation (Const T1 & PVAL, INT _N): N (_n)

{

Coe.Rserve (n 1);

For (int i = 0; i

{

Coe.push_back (pval [i]);

}

}

T getValue (t _val)

{

T TMP1 = 0;

For (int i = 0; i

{

T TMP2 = 1.0;

For (int J = 0; j

{

TMP2 * = _ VAL;

}

TMP1 = CoE [N-I] * TMP2;

}

Return TMP1;

}

Polyequation getDPoly ()

{

Assert (n> 1);

Vector TMP1;

For (int i = 0; i

{

TMP1.PUSH_BACK (COE [i] * (n-i));

}

Return Polyequation (TMP1, N-1);

}

Vector getrealsolve ()

{

Vector TMP1;

IF (n == 0)

{

Return TMP1;

}

IF (n == 1)

{

IF (CoE [0]! = 0)

{

TMP1.PUSH_BACK (COE [1] / Coe [0]);

}

Return TMP1;

}

IF (n == 2)

{

IF (CoE [0]! = 0)

{

IF ((COE [1] * Coe [1] -CoE [0] * CoE [2] * 4.0)> = 0)

{

TMP1.PUSH_BACK ((- CoE [1] SQRT (CoE [1] * Coe [1] -CoE [0] * CoE [2] * 4.0)) / (2.0 * CoE [0]));

TMP1.PUSH_BACK ((- Coe [1] -sQRT (CoE [1] * CoE [1] -CoE [0] * CoE [2] * 4.0)) / (2.0 * CoE [0]));

}

}

Else

{

Vector TMP2;

TMP2.PUSH_BACK (COE [1]);

TMP2.PUSH_BACK (COE [2]);

POLYEQETION TMP3 (TMP2, 1);

Return Tmp3.GetRealsolve ();

}

Return TMP1;

}

VECTOR TMP2 = getDPoly (). getRealSolve ();

INT N2 = TMP2.SIZE ();

IF (n2> 0)

{

Sort (Tmp2.begin (), TMP2.END ());

Divsol (MinResult, TMP2 [0], TMP1); DivSol (TMP2 [N2-1], MaxResult, TMP1);

IF (n> 1)

{

For (int i = 0; i

{

Divsol (TMP2 [i], TMP2 [i 1], TMP1);

}

}

}

Else

{

Divsol (MinResult, MaxResult, TMP1);

}

Return TMP1;

}

Void Divsol (T Val1, T Val2, Vector & Res)

{

IF (FABS (Val2-Val1)

{

Res.push_back (VAL1);

Return;

}

T TMP1 = GetValue (VAL1);

T TMP2 = GetValue (VAL2);

T TMP3 = GetValue ((Val1 VAL2) / 2.0);

IF (FABS (TMP1)

{

Res.push_back (VAL1);

Return;

}

IF (FABS (TMP2)

{

Res.push_back (VAL2);

Return;

}

IF ((TMP1> 0 && TMP2> 0) || (TMP1 <0 && TMP2 <0)))

{

Return;

}

IF (FABS (TMP3)

{

Res.push_back ((VAL1 VAL2) / 2.0);

Return;

}

IF ((TMP1> 0 && TMP3 <0) || (TMP1 <0 && TMP3> 0)))

{

Divsol (VAL1, (VAL1 VAL2) / 2.0 ,RES);

}

IF ((TMP2> 0 && TMP3 <0) || (TMP2 <0 && TMP3> 0)))))

{

Divsol (VAL2, (VAL1 VAL2) / 2.0 ,RES);

}

}

Private:

Int n;

Vector Coe;

}

#ENDIF

转载请注明原文地址:https://www.9cbs.com/read-46450.html

New Post(0)