Algorytmy stabilne
i niestabilne

Algorytmy niestabilne, powoduje małe błędy obliczeń, które następnie rosną i istotnie zniekształcają ostateczne wyniki. W algorytmach stabilnych takie błędy nie występują.

Algorytm niestabilny

Dla niektórych wartości zmiennych algorytm może generować niedokładne wyniki obliczeń (np. pierwiastkowanie). Wynika to z błędów zaokrągleń wyników pośrednich, które mogą mieć wpływ na brak dokładności wyników końcowych. Jednym z przykładów takich algorytmów jest algorytm rozwiązujący równanie kwadratowe za pomocą "delty".

Algorytm stabilny

Algorytmy stabilne eliminują błędy zaokrągleń, dzięki zwiększa się dokładność wyników końcowych. Aby uniknąć błędów zaokrągleń w algorytmie rozwiązującym równanie kwadratowe, do obliczania pierwiastków równania kwadratowego należy zastosować "deltę" w połączeniu ze wzorami Viéte'a. Wynika to stąd, że błąd zaokrąglenia spowodowany jest odejmowaniem bliskich co do wartości liczb. Zachodzi to w liczniku wzorów na pierwiastki równania w algorytmie "delty".

Zadanie 1

Podaj specyfikację i skonstruuj algorytm niestabilny oraz stabilny w postaci schematu blokowego i programów w językach C++ i Pascal rozwiązujący równanie kwadratowe ax2+bx+c=0.

Specyfikacja

Wejście: Liczba rzeczywista: a≠0. Dowolne liczby rzeczywiste: b, c.
Wyjście: Pierwiastki rzeczywiste równania kwadratowego lub komunikat informujący o braku rozwiązania.

Algorytm niestabilny

Schemat blokowy

center

Program w języku C++

#include <iostream>
#include <cmath>

using namespace std;
main()
{
double a, b, c, delta, x1, x2;
cout<<"podaj współczynniki równania a, b, c:"<<endl;
cin>>a>>b>>c;
if (a==0) cout<<"to nie jest równanie kwadratowe"<<endl;
else
{
delta=b*b-4*a*c;
if (delta<0) cout<<"równanie nie ma pierwiastków"<<endl;
else if (delta==0) {x1=-b/(2*a); cout<<"x="<<x1<<endl;}
        else
        {
        x1=(-b-sqrt(delta))/(2*a);
        x2=(-b+sqrt(delta))/(2*a);
        cout<<"x1= "<<x1<<"\tx2= "<<x2<<endl;
        }
}
return 0;
}

Program w języku Pascal

program rownanie_kwadratowe;
var a, b, c, delta, x1, x2: real;
begin
   writeln('podaj współczynniki równania a, b, c:')
   readln(a,b,c);
   if a=0 then writeln('to nie jest równanie kwadratowe')
   else
   begin			
   delta:=sqr(b)-4*a*c;
   if delta<0 then writeln('równanie nie ma pierwiastków')
   else if delta=0 then begin x1:=-b/(2*a); writeln('x=';x1:0:5) end
           else
           begin
              x1:=(-b-sqrt(delta))/(2*a);
              x2:=(-b+sqrt(delta))/(2*a);
              writeln('x1=',x1:0:5,'   x2=',x2:0:5)
           end
   end
end.

Algorytm stabilny

Schemat blokowy

center

Program w języku C++

#include <iostream>
#include <cmath>

using namespace std;
main()
{
double a, b, c, delta, x1, x2, pom;
cout<<"podaj współczynniki równania a, b, c:"<<endl;
cin>>a>>b>>c;
if (a==0) cout<<"to nie jest równanie kwadratowe"<<endl;
else
{
delta=b*b-4*a*c;
if (delta<0) cout<<"równanie nie ma pierwiastków"<<endl;
else if (delta==0) {x1=-b/(2*a); cout<<"x="<<x1<<endl;}
        else 
        {
        pom=c/a;
        if b>0 {x1=(-b-sqrt(delta))/(2*a); x2=pom/x1;}
        else {x2=(-b+sqrt(delta))/(2*a); x1=pom/x2;}        
        cout<<"x1= "<<x1<<"\tx2= "<<x2<<endl;
        }
}
return 0;
}

Program w języku Pascal

program rownanie_kwadratowe;
var a, b, c, delta, x1, x2, pom: real;
begin
   writeln('podaj współczynniki równania a, b, c:')
   readln(a,b,c);
   if a=0 then writeln('to nie jest równanie kwadratowe')
   else
   begin			
   delta:=sqr(b)-4*a*c;
   if delta<0 then writeln('równanie nie ma pierwiastków')
   else if delta=0 then begin x1:=-b/(2*a); writeln('x=';x1:0:5) end
           else
           begin
              pom:=c/a;
              if b>0 then
                  begin
                  x1:=(-b-sqrt(delta))/(2*a);
                  x2:=pom/x1;
                  writeln('x1=',x1:0:5,'   x2=',x2:0:5)
                  end
              else
                  begin
                  x2:=(-b+sqrt(delta))/(2*a);
                  x1:=pom/x2;
                  writeln('x1=',x1:0:5,'   x2=',x2:0:5)
                  end
   end
end.
Zadania o algorytmach stabilnych i niestabilnych