Advertisement
IlidanBabyRage

polynom.cpp

Jun 26th, 2015
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. typedef vector<double> vd;
  9.  
  10. const int MAX = 10;
  11. double LEFT_BORDER = -1e2;
  12. double RIGHT_BORDER = 1e2;
  13. int N = 5;
  14.  
  15. double polynom[MAX][MAX];
  16. double e = 0.001;
  17. vd extremum[MAX];
  18.  
  19. void getDerivative(int n);
  20. void print();
  21. double f(int n, double x);
  22. bool bs(double l, double r, int n, double &ans);
  23. void getExtrem(int n);
  24.  
  25. int main(){
  26.  
  27.     for (int i = 0; i < MAX; i++)
  28.         for (int j = 0; j < MAX; j++)
  29.             polynom[i][j] = 0;
  30.  
  31.     for (int i = 1; i <= 6; i++){
  32.         cin >> polynom[0][6 - i];
  33.     }
  34.     cin >> e;
  35.     for (int i = 1; i <= 5; i++)
  36.         getDerivative(i);
  37.     for (int i = 4; i >= 0; i--)
  38.         getExtrem(i);
  39.     for (int i = 0; i < extremum[0].size(); i++)
  40.         cout << (float)extremum[0][i] << " " << f(0, extremum[0][i]) << endl;
  41.  
  42.     return 0;
  43. }
  44.  
  45. void getDerivative(int n){
  46.     if (n < 1)
  47.         return;
  48.     for (int i = 0; i < MAX - 1; i++){
  49.         polynom[n][i] = polynom[n - 1][i + 1] * (i + 1);
  50.     }
  51. }
  52.  
  53. void print(){
  54.     for (int i = 0; i < MAX; i++){
  55.         for (int j = 0; j < MAX; j++)
  56.             cout << polynom[i][j] << " ";
  57.         cout << endl;
  58.     }
  59. }
  60.  
  61. double f(int n, double x){
  62.     double ans = 0;
  63.     for (int i = 0; i < MAX; i++){
  64.         ans += polynom[n][i] * pow(x, i);
  65.     }
  66.     return ans;
  67. }
  68.  
  69. bool bs(double l, double r, int n, double &ans){
  70.     double m;
  71.     if (f(n, l) * f(n, r) > 0)
  72.         return false;
  73.     while (abs(r - l) > e){
  74.         m = (l + r) / 2;
  75.         if (f(n, m) * f(n, l) > 0)
  76.             l = m;
  77.         else
  78.             r = m;
  79.     }
  80.     ans = m;
  81.     return true;
  82. }
  83.  
  84. void getExtrem(int n){
  85.     extremum[n].resize(0);
  86.     if (n == N - 1){
  87.         extremum[n].push_back(-polynom[n][0] / polynom[n][1]);
  88.         return;
  89.     }
  90.     double l, r, tmp_ans;
  91.     if (!extremum[n + 1].size()){
  92.         l = LEFT_BORDER;
  93.         r = RIGHT_BORDER;
  94.         if (bs(l, r, n, tmp_ans)){
  95.             extremum[n].push_back(tmp_ans);
  96.         }
  97.         return;
  98.     }
  99.  
  100.     for (int i = 0; i < extremum[n + 1].size(); i++){
  101.         if (i == 0)
  102.             l = LEFT_BORDER;
  103.         else
  104.             l = r;
  105.         r = extremum[n + 1][i];
  106.         if (bs(l, r, n, tmp_ans)){
  107.             extremum[n].push_back(tmp_ans);
  108.         }
  109.     }
  110.     l = r;
  111.     r = RIGHT_BORDER;
  112.     if (bs(l, r, n, tmp_ans)){
  113.             extremum[n].push_back(tmp_ans);
  114.         }
  115. }
  116.  
  117. //1.0 2.5 -1.0 -3.5 -1.0 0.1
  118. //ans : -2.377 -0.944 -0.466 0.078 1.215
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement