Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <iomanip>
- long double func(long double x)
- {
- return sin(x)-0.5*x;
- }
- long double dfunc(long double x)
- {
- return cos(x)-0.5;
- }
- class RootFinder{
- private:
- long double (*drf)(long double ,long double ,long double ,long double );
- long double (*f)(long double );
- long double (*df)(long double );
- long double root2(long double min, long double max)
- {
- long double x;
- x=(max+min)/2;
- long double y=x-f(x)/df(x);
- if (f(y)<pow(10,-20)&&f(y)>-1*pow(10,-20))
- return y;
- long double w=y-f(y)/df(y);
- return root2(w,w);
- }
- long double root1(long double min, long double max)
- {
- std::vector<long double> d(2);
- d.at(0)=min;
- d.at(1)=max;
- long double df=(max-min)/2;
- if(f(d.at(0)+df)==f(d.at(0)))
- return d.at(0);
- else if(f(d.at(1)-df)==f(d.at(1)))
- return d.at(1);
- if( (f(d.at(0)+df)>0&&f(d.at(0))<0) || (f(d.at(0)+df)<0&&f(d.at(0))>0) )
- {
- return root1(d.at(0),d.at(0)+df);
- }
- else
- {
- std::vector<long double>::iterator it;
- it=d.begin();
- d.erase(it);
- return root1(d.at(0)-df,d.at(0));
- }
- }
- public:
- RootFinder(){
- std::cout<<"shaviman\n";
- }
- RootFinder( long double (*function)(long double )){
- std::cout<<"tetriman\n";
- f=function;
- }
- RootFinder( long double (*function)(long double ), long double (*dfunction)(long double )){
- f=function, df=dfunction;
- }
- void setDf(long double (*dfunction)(long double )){
- df=dfunction;
- }
- long double callF(long double x){
- return f(x);
- }
- long double GetRoot2(long double min, long double max){
- return root2(min,max);
- }
- long double GetRoot1(long double min, long double max){
- return root1(min,max);
- }
- };
- class dRootFinder: public RootFinder{
- private:
- long double a, b, c;
- long double DrtFunc (long double x)
- {
- return a*pow(x,2)+b*x+c;
- }
- public:
- dRootFinder(long double A,long double B,long double C){
- a=A, b=B, c=C;
- RootFinder(DrtFunc);
- }
- std::vector<long double> droot(){
- std::vector<long double> x(2);
- if(pow(b,2)-4*a*c<0){
- std::cout<<"no roots\n";
- x.pop_back();
- x.pop_back();
- return x;
- }
- else if(pow(b,2)-4*a*c==0){
- x.pop_back();
- x.at(0)=-b/2/a;
- return x;
- }
- else{
- x.at(0)=(-b-pow((pow(b,2)-4*a*c),0.5))/2/a;
- x.at(1)=(-b+pow((pow(b,2)-4*a*c),0.5))/2/a;
- return x;
- }
- }
- std::vector<long double>GetDRoot(){
- return droot();
- }
- };
- int main()
- {
- long double min=1, max=3;
- // long double x;
- // std:: cin>>x;
- // RootFinder func1(func,dfunc);
- // std:: cout<<func1.callF(x)<<std::endl;
- // std:: cout<<std::setprecision(9)<<func1.GetRoot2(min,max)<<std::endl;
- // std:: cout<<std::setprecision(9)<<func1.GetRoot1(0,2)<<std::endl;
- dRootFinder drt1(1,0,0);
- // std::vector<long double> a=drt1.GetDRoot();
- //for(int i=0;i<a.size();i++)
- // std::cout<<a.at(i)<<std::endl;
- std:: cout<<std::setprecision(9)<<drt1.GetRoot1(-5,-0.5)<<std::endl;
- // std:: cout<<drt1.callF(3)<<std::endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement