灌水四人组之蛋吧 关注:196贴子:14,667

一些简单的算法和程序

只看楼主收藏回复

一楼给亲爱的度娘


IP属地:上海1楼2010-05-31 22:45回复
    0.618算法:
    [a,b] 为f(x)的单峰区间,【lambda】=0.618
    1. 确定初始点x1=a+(1-【lambda】)(b-a)           x2=a+【lambda】(b-a)
    f1=f(x1) f2=f(x2)
    2.判定收敛      |b-a|<c?     是 x'=(a+b)/2为近似极小值点问题
    3.缩短区间(这部分的等号为赋值)
    (1)若f1<f2   则a=>a   x2=>b   x1=>x2 f1=>f2   转4
    (2)若f1>f2   则x1=>a b=>b    x2=>x1 f2=>f1   转5
    (3)若f1==f2 则x1=>a x2=>b                    转1
    4.x1=a+(1-【lambda】)(b-a)          f1=f(x1)     转2
    5.x2=a+【lambda】(b-a)              f2=f(x2)     转2


    IP属地:上海2楼2010-05-31 22:47
    回复
      C++程序:
      #include<iostream>
      #include<cmath>
      using namespace std;
      const double E = 2.718281828459045235360287;
      const double eps = 3*1E-2;
      const double lambda = (sqrt(5.0) - 1)/2.0;
      double f(double x)
      {
      return pow(E,-x) + x*x;
      }
      int main()
      {
      double a = 0,b = 1,x1,x2,f1,f2;
      while(true)
      {
      x1 = a + (1 - lambda)*(b - a),x2 = a + lambda*(b - a);
      f1 = f(x1),f2 = f(x2);
      if(fabs(b - a) < eps)
      {
      printf("x = %.10lf\n",(a + b)/2.0);
      break;
      }
      la:
      if(f1 < f2)
      {
      b = x2,x2 = x1,f2 = f1;
      x1 = a + (1 - lambda)*(b - a),f1 = f(x1);
      goto la;
      }
      else if(f1 > f2)
      {
      a = x1,x1 = x2,f1 = f2;
      x2 = a + lambda*(b - a),f2 = f(x2);
      goto la;
      }
      else
      a = x1,b = x2;
      }
      return 0;
      }


      IP属地:上海3楼2010-05-31 22:48
      回复
        鄙视鄙视goto的人


        IP属地:广东4楼2010-05-31 22:58
        回复
          弦截法算法:



          IP属地:上海5楼2010-05-31 22:59
          回复
            C++程序:
            #include<iostream>
            #include<iomanip>
            #include<cmath>
            using namespace std;
            double f(double);
            double xpoint(double,double);
            double root(double,double);
            int main()
            {double x1,x2,f1,f2,x;
            do
                {cout<< "input x1,x2:";
                cin>>x1>>x2;
                f1=f(x1);
                f2=f(x2);
                }while(f1*f2>=0);
            x=root(x1,x2);
            cout<<setiosflags(ios::fixed)<<setprecision(8);
            cout<<"A root of equation is "<<x<<endl;
            return 0;
            }
            double f(double x)
            {double y;
            y=x*x*x*x-4*x*x*x-6*x*x-16*x+4;
            return y;
            }
            double xpoint(double x1,double x2)
            {double y;
            y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
            return y;
            }
            double root(double x1,double x2)
            {double x,y,y1;
            y1=f(x1);
            do
            {x=xpoint(x1,x2);
            y=f(x);
            if(y1*y>0)
            {y1=y;x1=x;
            }
            else x2=x;
            }while(fabs(y)>=0.00001);
            return x;
            }
            


            IP属地:上海6楼2010-05-31 23:01
            回复
              牛顿法算法:



              IP属地:上海7楼2010-05-31 23:04
              回复
                C++程序:
                #include<iostream>
                #include<cmath>
                using namespace std;
                void fun(double, double);
                int main()
                {
                double x0, epsilon;
                cout << "X0初始值:"<<endl;
                cin >>x0;
                cout<<"请输入允许的最大误差: "<<endl;
                cin>>epsilon;
                fun(x0, epsilon);
                return 0;
                }
                void fun(double x0, double epsilon)
                {
                double x1 = x0;
                x0 = (x1 - (4*x1*x1*x1 - 12*x1*x1 - 12*x1-16) / (12*x1*x1 -24*x1-12));
                if(fabs(x0 - x1) > epsilon)
                fun(x0, epsilon);
                else
                cout << "方程的近似根是" << x0 << endl;
                }
                


                IP属地:上海8楼2010-05-31 23:05
                回复
                  IP属地:上海9楼2010-05-31 23:14
                  回复
                    二分法泪目


                    IP属地:广东10楼2010-06-01 12:46
                    回复
                      回复:10楼
                      二分法写过,不过程序找不到了,有空再写吧。。。


                      IP属地:上海11楼2010-06-01 13:19
                      回复
                        嗯…好基础的算法不过我只能用C实现…最小二乘法大爱


                        IP属地:江苏12楼2010-06-01 13:21
                        回复
                          回复:12楼
                          难的都是从简单的而来,要难的等整理完了发吧。。。


                          IP属地:上海13楼2010-06-01 13:47
                          回复
                            我吧里有二分法。。


                            IP属地:广东14楼2010-06-01 19:07
                            回复
                              回复14楼:
                              二分法的速度貌似没0.618法的收敛速度快吧…


                              IP属地:上海15楼2010-06-01 19:26
                              回复