Advertisement
frentzy

calcul numeric lab 2

Mar 6th, 2020
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.96 KB | None | 0 0
  1. //Metoda Bairstow
  2.  
  3. #pragma warning(disable:4996)
  4. #include <stdio.h>
  5. #include <conio.h>
  6. #include <stdlib.h>
  7. #include <iostream>
  8. #include <string>
  9. #include <math.h>
  10. #include <cmath>
  11. #include <algorithm>
  12.  
  13. using namespace std;
  14.  
  15. void  grad1(long double a,long double b) {
  16.     /*cout << "grad 1 a= " << a << endl;
  17.     cout << "grad 1 b= " << b << endl;*/
  18.  
  19.     double x;
  20.     if (a == 0 && b == 0) {
  21.         cout << "x poate fi orice solutie";
  22.     }
  23.     else if (b == 0) {
  24.         x = 0;
  25.         cout << "x = " << x;
  26.     }
  27.     else if (a == 0) {
  28.         cout << "x poate fi orice solutie";
  29.     }
  30.     else {
  31.         x = -b / a;
  32.         cout << "x = " << x;
  33.     }
  34.  
  35. }
  36.  
  37.  
  38. void grad2(long double a,long double b,long double c) {
  39.     /*cout << "a= " << a<<endl;
  40.     cout << "b= " << b<<endl;
  41.     cout << "c= " << c<<endl;*/
  42.  
  43.     double  x, delta, x1, x2;
  44.     double re[2], im[2];
  45.     if (a == 0)
  46.         grad1(b, c);
  47.     else
  48.     {
  49.         delta = pow(b, 2) - 4 * a*c;
  50.         if (delta < 0) {//caz in care delta < 0
  51.             re[0] = -b / 2 * a;
  52.             im[0] = sqrt(-delta) / 2 * a;
  53.             re[1] = -b / 2 * a;
  54.             im[1] = -sqrt(-delta) / 2 * a;
  55.             cout << "Ecuatia are solutii imaginare" << endl;
  56.             cout << "x1=" << re[0] << " + i*(" << im[0] << ")" << endl;
  57.             cout << "x2=" << re[1] << " + i*(" << im[1] << ")" << endl;
  58.         }
  59.         else
  60.             if (delta == 0) // caz in care delta este 0
  61.             {
  62.                 cout << "Ecuatia are solutii egale!";
  63.                 cout << "x1 = x2 = " << -b / (2 * a);
  64.             }
  65.             else // caz in care delta > 0
  66.             {
  67.                 x1 = (-b + sqrt(delta)) / 2 * a;
  68.                 x2 = (-b - sqrt(delta)) / 2 * a;
  69.                 cout << "Ecuatia are solutii reale" << endl;
  70.                 cout << "x1=" << x1 << endl;
  71.                 cout << "x2=" << x2 << endl;
  72.             }
  73.     }
  74.  
  75.         //return 0;
  76. }
  77.  
  78.  
  79. void main() {
  80.     //grad1(1.0/25.0, 1.0/2.0);
  81.     //grad2(0,2,1);
  82.  
  83.     //_getche();
  84.     int n;
  85.     long double a[100], b[100], c[100],p,q,x,delta,epsilon,p_mare=0,q_mare=0;
  86.     epsilon = 0.001;
  87.     p = q = 0.1;
  88.     x = 0;
  89.     n = 3;
  90.     /*a[0] = 1;
  91.     a[1] = 1;
  92.     a[2] = -10;
  93.     a[3] = -34;
  94.     a[4] = -26;*/
  95.     a[0] = 1;
  96.     a[1] = 0;
  97.     a[2] = -3;
  98.     a[3] = 1;
  99.     while (n >= 3) {
  100.         do {
  101.             b[0] = a[0];
  102.             b[1] = a[1] - p*b[0];
  103.             for (int i = 2; i <= n; i++) {
  104.                 b[i] = a[i] - p*b[i - 1] - q*b[i - 2];
  105.             }
  106.             c[0] = b[0];
  107.             c[1] = b[1] - p*c[0];
  108.             for (int i = 2; i <= n-1; i++) {
  109.                 c[i] = b[i] - p*c[i - 1] - q*c[i - 2];
  110.             }
  111.             delta = pow(c[n - 2], 2) - c[n - 3] * c[n - 1] + c[n - 3] * b[n - 1];
  112.             p_mare = -b[n - 1] * c[n - 2] + b[n] * c[n - 3];
  113.             q_mare = -b[n] * c[n - 2] + b[n - 1] * c[n - 1] - pow(b[n - 1], 2);
  114.             p = p - (p_mare / delta);
  115.             q = q - (q_mare / delta);
  116.            
  117.         } while (max(abs(b[n - 1]), (abs(b[n] + p*b[n - 1]))) > epsilon);
  118.  
  119.         cout << "\nrezolva ecuatia: x^2 + "<<p<<"x + "<<q<<" = 0\n";   
  120.         grad2(1, p, q);
  121.         n = n - 2;
  122.         for (int i = 0;i <= n;i++) {
  123.             a[i] = b[i];
  124.         }
  125.     }
  126.  
  127.     if (n == 2) {
  128.         cout << "\nrezolva ecuatia: "<< a[0]<<"*x^2 +"<<a[1]<<"*x + "<<a[2] <<" = 0\n";
  129.         grad2(a[0], a[1], a[2]);
  130.     }
  131.     else {
  132.         cout << "\nrezolva ecutia: "<<a[0]<<"*x + "<<a[1] <<" = 0\n";
  133.         grad1(a[0], a[1]); 
  134.     }
  135.  
  136.  
  137.     _getche();
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement