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
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
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