- #include <iostream>
- #include <cmath>
- #include <limits.h>
- using namespace std;
- double tryg (double x)
- {
- return sin(2*x+1)-tan(x)+1;
- }
- double wielomian (double x)
- {
- return 3*x*x*x+5*x*x+2*x+5;
- }
- double wykladnicza(double x) //funkcja w postaci f(x)=5^x-25
- {
- return 2*exp(x/2)-3;
- }
- void bisekcja (double (*funkcja)(double), double a, double b, bool stop)
- {
- unsigned int i=0;
- unsigned int ilosc=UINT_MAX;
- double x;
- double epsilon=-1;
- if (stop)
- {
- cout<<"podaj wartosc epsilon"<<endl;
- cin>>epsilon;
- }
- else
- {
- cout<<"podaj ilosc iteracji"<<endl;
- cin>>ilosc;
- }
- do
- {
- x=(a+b)/2;
- if (funkcja(a)*funkcja(x)<0)
- b=x;
- else
- a=x;
- i++;
- }while(((funkcja(x)>epsilon)||(funkcja(x)<0-epsilon))&&(i<ilosc));
- cout<<"wynik to "<<x<<endl;
- cout<<"wykonano "<<i<<" iteracji"<<endl;
- }
- void sieczne (double (*funkcja)(double), double a, double b, bool stop)
- {
- unsigned int i=0;
- unsigned int ilosc=UINT_MAX;
- double x;
- double epsilon=-1;
- if (stop)
- {
- cout<<"podaj wartosc epsilon"<<endl;
- cin>>epsilon;
- }
- else
- {
- cout<<"podaj ilosc iteracji"<<endl;
- cin>>ilosc;
- }
- do
- {
- x=((a-funkcja(a)*(a-b))/(funkcja(a)-funkcja(b)));
- a=b;
- b=x;
- i++;
- }while(((funkcja(x)>epsilon)||(funkcja(x)<0-epsilon))&&(i<ilosc)&&(a!=b));
- cout<<"wynik to "<<x<<endl;
- cout<<"wykonano "<<i<<" iteracji"<<endl;
- }
- int main()
- {
- double a;
- double b;
- char wybor;
- bool stop;
- cout<<"wybierz, czy chcesz operowac na funkcji trygonometrycznej (0), wielomianowej (1) czy wykladniczej (2)"<<endl;
- cin>>wybor;
- cout<<"Teraz podaj przedzial na ktorym szukamy miejsc zerowych"<<endl;
- cout<<"Podaj lewe ograniczenie przedzialu:"<<endl;
- cin>>a;
- cout<<"Podaj prawe ograniczenie przedzialu:"<<endl;
- cin>>b;
- cout<<"wybierz, czy warunkiem stopu ma byc zadana ilosc iteracji (0), czy osiagniecie zadanej dokladnosci obliczen (1)"<<endl;
- cin>>stop;
- if (wybor=='0')
- {
- if(tryg(a)*tryg(b)>0)
- {
- cout<<"nieprawidlowy przedzial"<<endl;
- return 0;
- }
- bisekcja(tryg, a, b, stop);
- sieczne(tryg, a, b, stop);
- }
- else if (wybor=='1')
- {
- if(wielomian(a)*wielomian(b)>0)
- {
- cout<<"nieprawidlowy przedzial"<<endl;
- return 0;
- }
- bisekcja(wielomian, a, b, stop);
- sieczne(wielomian, a, b, stop);
- }
- else if (wybor=='2')
- {
- if(wykladnicza(a)*wykladnicza(b)>0)
- {
- cout<<"nieprawidlowy przedzial"<<endl;
- return 0;
- }
- bisekcja(wykladnicza, a, b, stop);
- sieczne(wykladnicza, a, b, stop);
- }
- /*dopa
- {
- }
- while(wybur(x, wybor)<epsilon&&wybur(x, wybor)>0-epsilon);*/
- return 0;
- }