Advertisement
Kenoru

Untitled

Jan 13th, 2019
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. class Polynom
  8. {
  9.     int power;
  10.     double* gaps = nullptr;
  11.     int rootCount = 0;
  12. public:
  13.     double* coefs = nullptr;
  14.     double* roots = nullptr;
  15.  
  16.     ~Polynom()
  17.     {
  18.         if (coefs != nullptr)
  19.             delete[] coefs;
  20.         if (gaps != nullptr)
  21.             delete[] gaps;
  22.         if (roots != nullptr)
  23.             delete[] roots;
  24.     }
  25.     double getVal(double X)
  26.     {
  27.         double val = coefs[power];
  28.         for (int i = 0; i < power; i++)
  29.             val += coefs[i] * pow(X, power - i);
  30.  
  31.         return val;
  32.     }
  33.     void setCoefs(int power, double* coefs)
  34.     {
  35.         this->power = power;
  36.         this->coefs = new double[power + 1];
  37.         for (int i = 0; i <= power; i++)
  38.             this->coefs[i] = coefs[i];
  39.     }
  40.     void setGaps(double* extrems)
  41.     {
  42.         gaps = new double[power + 1];
  43.         double maxCoef = fabs(coefs[1]);
  44.         for (int i = 1; i <= power; i++)
  45.             if (fabs(coefs[i]) > maxCoef)
  46.                 maxCoef = fabs(coefs[i]);
  47.  
  48.         double R = 1 + maxCoef / fabs(coefs[0]);
  49.         gaps[0] = -R;
  50.         gaps[power] = R;
  51.         for (int i = 1; i < power; i++)
  52.             gaps[i] = extrems[i - 1];
  53.  
  54.         /*DEBUG
  55.         cout << "GAPS" << endl;
  56.         for (int i = 0; i < power + 1; i++)
  57.             cout << gaps[i] << "   ";
  58.         cout << endl;*/
  59.     }
  60.     void solve(double eps)
  61.     {
  62.         if (power == 1)
  63.         {
  64.             rootCount = 1;
  65.             roots = new double[1];
  66.             roots[0] = -coefs[1] / coefs[0];
  67.         }
  68.         else
  69.         {
  70.            
  71.             for (int i = 0; i < power; i++)
  72.             {
  73.                 if (getVal(gaps[i])*getVal(gaps[i + 1]) < 0)
  74.                     rootCount++;
  75.                 else if (getVal(gaps[i]) == 0)
  76.                     rootCount++;
  77.             }
  78.             roots = new double[rootCount];
  79.             int curRootC = 0;
  80.             for (int i = 0; i < power; i++)
  81.             {
  82.                 if (getVal(gaps[i])*getVal(gaps[i + 1]) < 0)
  83.                 {
  84.                     double a = gaps[i];
  85.                     double b = gaps[i + 1];
  86.                     double curX = a;
  87.                     double prevX;
  88.                    
  89.                     do
  90.                     {
  91.                         prevX = curX;
  92.                         curX = a - getVal(a) * (b - a) / (getVal(b) - getVal(a));
  93.                         if (getVal(a)*getVal(curX) < 0)
  94.                         {
  95.                             b = curX;
  96.                         }
  97.                         else
  98.                         {
  99.                             a = curX;
  100.                         }
  101.                     } while (fabs(curX - prevX) > eps);
  102.                     roots[curRootC] = curX;
  103.                     curRootC++;
  104.                 }
  105.                 else if (getVal(gaps[i]) == 0)
  106.                 {
  107.                     roots[curRootC] = gaps[i];
  108.                     curRootC++;
  109.                 }
  110.             }
  111.         }
  112.         /*DEBUG
  113.         cout << "ROOTS" << endl;
  114.         for (int i = 0; i < rootCount; i++)
  115.         {
  116.             cout << roots[i] << "   ";
  117.         }
  118.         cout << endl; */
  119.     }
  120.  
  121.     int getRootQt()
  122.     {
  123.         return rootCount;
  124.     }
  125.  
  126.     double * getRoots()
  127.     {
  128.         return roots;
  129.     }
  130.     double * getCoefs()
  131.     {
  132.         return coefs;
  133.     }
  134. };
  135.  
  136. int main()
  137. {
  138.     int power;
  139.     double* eqCoefs;
  140.     cout << "Solving polynomical equtsion" << endl;
  141.     cout << "Set power of polynom: ";
  142.     cin >> power;
  143.     eqCoefs = new double[power + 1];
  144.     cout << "Input coefficients" << endl;
  145.     for (int i = 0; i <= power; i++)
  146.     {
  147.         cin >> eqCoefs[i];
  148.     }
  149.  
  150.     Polynom* dervs = new Polynom[power];
  151.     dervs[0].setCoefs(power, eqCoefs);
  152.     for (int i = 0; i < power-1; i++)
  153.     {
  154.         double *dervCoefs = new double[power - i];
  155.         for (int j = 0; j < power - i; j++)
  156.             dervCoefs[j] = dervs[i].coefs[j] * (power - i - j);
  157.        
  158.         dervs[i + 1].setCoefs(power - 1 - i, dervCoefs);
  159.         delete[] dervCoefs;
  160.     }
  161.  
  162.     cout << "Polynomical equation: ";
  163.     for (int i = 0; i < power; i++)
  164.         cout << dervs[0].coefs[i] << "*X^" << power - i << " + ";
  165.     cout << dervs[0].coefs[power] << " = 0" << endl;
  166.  
  167.     double accur;
  168.     cout << "Set accuracy: ";
  169.     cin >> accur;
  170.  
  171.     for (int i = power - 1; i > 0; i--)
  172.     {
  173.         dervs[i].solve(accur);
  174.         dervs[i - 1].setGaps(dervs[i].roots);
  175.     }
  176.     dervs[0].solve(accur);
  177.  
  178.     double* roots = dervs[0].getRoots();
  179.     cout << "Roots: ";
  180.     for (int i = 0; i < dervs[0].getRootQt(); i++)
  181.         cout << roots[i] << "       ";
  182.     cout << endl;
  183.    
  184.     system("pause");
  185.     delete[] eqCoefs;
  186.     delete[] dervs;
  187.     return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement