Advertisement
desdemona

pochodna z pochodnej

May 13th, 2013
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. #include <vector>
  4. //#include <cmath>
  5.  
  6. using namespace std;
  7. double funkcja(double x)
  8. {
  9.     //return sin(x);
  10.     //return tan(x);
  11.     //return 6*pow(x, 5) - 12*pow(x, 3) + pow(x, 2) - 8*x;
  12.     //return (-1)/x + sin(x);
  13.     //return tan(x)*tan(x)-x;
  14.     //return 1/sin(x);
  15.     //return sin(1/x);
  16.     //return -pow(x,2) - sin(x) + 0.98;
  17.     //return 12*x*x - 10*x - 6.9815;
  18.     return log(x+1)-2*x*x+1;
  19.  
  20. }
  21.  
  22. double pochodna(double x)
  23. {
  24.     //return cos(x);
  25.     //return 2/(cos(2*x) + 1); //tan(x)
  26.     //return 2*(15*pow(x,4) - 18*pow(x,2) + x - 4);
  27.     //return 1/pow(x,2) + cos(x);
  28.     //return 2*tan(x)*(1/cos(x))*(1/cos(x)) -1;
  29.     //return 2*cos(x)/(cos(2*x) - 1);
  30.     //return -cos(1/x)/(x*x);
  31.     //return -2*x - cos(x);
  32.     //return 24*x - 10;
  33.     return -4*x + 1/(x+1);
  34. }
  35.  
  36. double druga_pochodna(double x)
  37. {
  38.     //return 0;
  39.     //return funkcja(x)*pochodna(x)*2; //tan(x)
  40.     //return 120*pow(x,3) -72*x + 2;
  41.     //return (2*x*cos(1/x) - sin(1/x))/pow(x,4); //sin(1/x)
  42.     //return 24;
  43.     return -4 -1/((x+1)*(x+1));
  44. }
  45.  
  46. struct przedzial
  47. {
  48.     double a;
  49.     double b;
  50. };
  51. int main()
  52. {
  53.     double epsilon = 1e-1;
  54.     double a=-5;
  55.     double b=5;
  56.     //double krok = (double)(b-a)/100000.0; //1000 przedzialow, musi starczyc
  57.     double krok = 1e-1;
  58.     int N=100000;
  59.     cout.precision(50);
  60.     //najpierw wyznaczymy przedzialy izolacji pierwiastkow pomiedzy a i b
  61.     vector<przedzial> p_i;
  62.     //p_i to przedzialy izolacji
  63.     double aa=a;
  64.     double bb=a+krok;
  65.     double fa=0;
  66.     double fb=funkcja(aa);
  67.     double m;
  68.     przedzial znaleziony;
  69.     bool asym = false;
  70.     int i;
  71.     while(bb<=b)
  72.     {
  73.         fa=fb;
  74.         fb=funkcja(bb);
  75.         if( (double)(fa*fb) <= 0.0)
  76.         {  
  77.             znaleziony.a = aa;
  78.             znaleziony.b = bb;
  79.             if(funkcja(aa) != 0.0)
  80.                 p_i.push_back(znaleziony);
  81.             //bo nie chcemy miec 2 razy
  82.         }
  83.         aa=bb;
  84.         bb+=krok;
  85.     }
  86.  
  87.     for(int eps=0; eps<15; eps++)
  88.     {
  89.     //metoda bisekcji
  90.     for(int j=0; j<p_i.size(); j++)
  91.     {
  92.         double x1;// p_i[j].a + (double)(((double)p_i[j].b-(double)p_i[j].a)/2.0);
  93.         aa=p_i[j].a;
  94.         bb=p_i[j].b;
  95.         for(i=0; i<N; i++)
  96.         {
  97.            
  98.             x1= aa + ((bb-aa)/2.0);
  99.             //piekne warunki w ifie, monotonicznosc sprawdzamy.
  100.             if(!(( (funkcja(aa) <= funkcja(x1)) && (funkcja(x1) <= funkcja(bb)) )||( (funkcja(aa) >= funkcja(x1)) && (funkcja(x1) >= funkcja(bb) ) )))
  101.             {
  102.                 asym=true;
  103.                 cout << "asym\n";
  104.                 break;
  105.             }
  106.  
  107.             if( funkcja(aa)*funkcja(x1) < 0)
  108.             {
  109.                 //aa bez zmian
  110.                 bb = x1;
  111.             }
  112.             else
  113.             {
  114.                 aa =x1;
  115.                 //bb bez zmian
  116.             }
  117.             if((abs(funkcja(x1)) < epsilon) && (abs(aa-bb) < epsilon))
  118.                 break;
  119.         }
  120.         if(asym==false)
  121.             cout << x1 << " "<< i <<"\n";
  122.         else
  123.             asym=false;
  124.     }
  125.  
  126.     //cout << "\n";
  127.     //metoda stycznych
  128.     for(int j=0; j<p_i.size(); j++)
  129.     {
  130.         double x1;
  131.         if((funkcja(p_i[j].a)*druga_pochodna(p_i[j].a)) > 0)
  132.             x1 = p_i[j].a;
  133.         else
  134.             x1 = p_i[j].b;
  135.         m = min(pochodna(p_i[j].a), pochodna(p_i[j].b));
  136.         for(i=0; i<N; i++)
  137.         {
  138.             if(pochodna(x1) == 0)
  139.             {
  140.                 cout << "pochodna jest zerem\n";
  141.                 break;
  142.             }
  143.             else
  144.             {
  145.                 x1 = x1 - funkcja(x1)/pochodna(x1);
  146.                 //if(!(x1 >= p_i[j].a && x1 <= p_i[j].b))
  147.                 if(x1 < p_i[j].a || x1 > p_i[j].b)
  148.                 {
  149.                     cout << "asymptopta\n";
  150.                     asym=true;
  151.                     break;
  152.                 }
  153.                
  154.             }
  155.             if(abs(funkcja(x1)/m) < epsilon)
  156.                 break;
  157.         }
  158.         if(asym == false)
  159.             cout << x1 << " "<< i <<"\n";
  160.         else
  161.             asym=false;
  162.     }
  163.     epsilon = epsilon/10;
  164.     }
  165.     return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement