【工程优化】一维搜索方法

一维搜索方法的分类如下:

        这篇文章主要讲解黄金分割法、二分法、牛顿法这三种一维搜索方法。黄金分割法只用到原函数,二分法用到函数的一阶导,牛顿法用到函数的二阶导。由于本文主要对研一上学期的课程中的部分算法进行程序实现,理论部分大多参考上课的课件

黄金分割法

    基本概念:

算法思想:


算法流程图及优缺点如下:


二分法

 基本思想:

牛顿法

基本思想:



算法流程图:

具体实现:

下面我们通过程序具体实现,在程序中,我们设置原函数都是f(x)=sinx/x,搜索区间都是[0,1],牛顿法中假设初始值设为1,具体程序如下所示

#include<stdio.h>
#include<math.h>
/********************函数的定义、一阶导、二阶导的模块 BEGIN*************************/
/*****************************\
输入:x为自变量
输出:x自变量对应的函数值
\*****************************/
double Function(double x)
{
    return (x-0.5)*(x-0.5);//这里填写函数式f(x),根据自己的函数修改
}
/*****************************\
输入:x为自变量
输出:x自变量对应的一阶导数值
\*****************************/
double Derivative(double x)//求函数的一阶导数
{
    double eps=0.0000001;//精度控制
    double dx=0.5;//设置初始的间隔,太大需要迭代多次,太小缺乏精度
    double dy=Function(x+dx)-Function(x);//函数值的增量
    double dd1=dy/dx;//导数
    double dd2=0;//dx变化时的导数
    dx=dx/2;//不断地减少x的增量
    dy=Function(x)-Function(x+dx);
    dd2=dy/dx;//计算新的导数值
    while(abs(dd1-dd2)>eps)//当相邻两次的导数值小于精度时终止迭代,得到导数
    {
        dd1=dd2;
        dx=dx/2.0;
        dy=Function(x+dx)-Function(x);
        dd2=dy/dx;
    }
    return dd2;
}
//求函数的2阶导数,与求一阶导数的原理一样,只需要把求函数值的函数Function换成求一阶导数的函数Derivative
/*****************************\
输入:x为自变量
输出:x自变量对应的二阶导数值
\*****************************/
double Derivative2(double x)
{
    double eps=0.00000001;
    double dx=0.5;
    double dy=Derivative(x+dx)-Derivative(x);
    double dd1=dy/dx;
    double dd2=0;
    dx=dx/2;
    dy=Derivative(x)-Derivative(x+dx);
    dd2=dy/dx;
    while(abs(dd1-dd2)>eps)
    {
        dd1=dd2;
        dx=dx/2.0;
        dy=Derivative(x+dx)-Derivative(x);
        dd2=dy/dx;
    }
    return dd2;
}
/********************函数的定义、一阶导、二阶导的模块  END*************************/
/******************************************\
输入:a,b为区间的上下限,n为最大的迭代次数
输出:打印函数最小值及对应的自变量x
\******************************************/
void GoldenSection(double a,double b,int n)//黄金分割法
{
    double l=a+0.382*(b-a);
    double h=a+0.618*(b-a);
    double region=b-a;

    double fl;
    double fh;
    int num=1;//迭代次数

    while(region>0.0000000001&&num<n)
    {
        fl=Function(l);
        fh=Function(h);
        if(fl>fh)
        {
            a=l;
            l=h;
            h=a+0.618*(b-a);
        }
        else
        {
            b=h;
            h=l;
            l=a+0.382*(b-a);
        }
        num++;
        region=abs(b-a);
    }
    if(num==n)
        printf("找不到最小值");
    else
    {
        printf("黄金分割法:x=%f时,最小值f(x)=%f",(a+b)/2,Function((a+b)/2));

    }
}
/******************************************\
输入:a,b为区间的上下限
输出:打印函数最小值及对应的自变量x
\******************************************/
void Dichotomy(double a,double b)//二分法
{
    double eps=0.0000001;
    double x=(a+b)/2;
    double region=b-a;
    double fxDerivative= Derivative(x);
    while(region>0.0000001&&abs(fxDerivative)>eps)
    {
        fxDerivative= Derivative(x);
        if(fxDerivative>eps)
            b=x;
        if(fxDerivative<-eps)
            a=x;
        x=(a+b)/2;
        region=abs(b-a);
    }
    printf("\n\n二分法:x=%f时,f(x)=%f\n",x,Function(x));
}
/******************************************\
输入:a,b为区间的上下限,x1是初始值
输出:打印函数最小值及对应的自变量x
\******************************************/
void Newton(double a,double b,double x1)
{
    double eps=0.0000001;
    double x=x1;
    double d1=Derivative(x1);//一阶导
    double d2;//二阶导
    while(abs(d1)>eps)
    {
        d2=Derivative2(x);
        if(d2<0)
            printf("二阶导小于0,无法求解");
        else
        {
            x=x-d1/d2;//x迭代公式
            d1=Derivative(x);
        }
    }
    printf("\n牛顿法:x=%f时,f(x)=%f\n\n",x,Function(x));
}
void main()
{
    GoldenSection(0,1,100000);//黄金分割法

    Dichotomy(0,1);//二分法
    Newton(0,1,1);//牛顿法
}

运行结果如下图:

原文:http://blog.csdn.net/tengweitw/article/details/43488767

作者:nineheadedbird

时间: 2024-10-24 05:05:31

【工程优化】一维搜索方法的相关文章

图像算法的工程优化技术

图像算法的工程优化技术 当一个很酷的图像算法实现之后,我们希望集成到软件中去,这时将会遇到最大的拦路虎:性能. 可以想像一下,如果美图秀秀做一个美颜效果要转圈圈转个30秒,还会有多少人用呢. 学术界喜欢推出复杂度更低的算法,去解决性能问题,而在实际工程应用中,对代码的优化和硬件的良好运用效果来得更快更显著,这里就对不改动算法,纯工程方面做性能优化的技术作一个简介. 流程优化--节能减排 对初始的算法代码进行优化,减少不必要的计算步骤,合理安排循环位置,减少过度的函数

javascript教程:关于if语句优化的方法

文章简介:UglifyJS是一个对javascript进行压缩和美化的工具,在它的文档说明中,我看到了几种关于if语句优化的方法.尽管我还没使用它去做一些尝试性的测试,但从这里可以看到它的确对js作了美化的工作.也许有人认为if语句就那么简单,能优化到什么程度? UglifyJS是一个对javascript进行压缩和美化的工具,在它的文档说明中,我看到了几种关于if语句优化的方法.尽管我还没使用它去做一些尝试性的测试,但从这里可以看到它的确对js作了美化的工作.也许有人认为if语句就那么简单,能

ASP.NET几种进行性能优化的方法及注意问题

asp.net|问题|性能|优化 网站的性能对于ASP.NET程序开发人员来说非常重要.一个优秀的网站虽然有美观的页面设计,完善的服务功能,但是打开网页时有长时间的延迟,用户最终将会无法忍受.尤其对于大型的电子商务网站而言,每秒钟有数万用户同时访问,没有良好的网站性能,根本无法满足庞大的需求. ASP.NET作为全新一代的动态网页生成系统,它在平台性能方面与原有的ASP相比已有了一个本质的提高.但要在此基础上开发出专业水准的.符合生产标准的.受用户欢迎的web应用程序,还需要开发人员从编程的角度

网页制作心得:WEB前端优化的方法

随着WEB2.0时代来,给网络的带来了空前的发展.前端用户体验变得越来越显的重要,从而来弥补B/S结构的用户交互型差的一些弊端,可是这样会带来一个问题就是会增加客户端的压力,比如大量运用JS代码,大家都知道JS代码是运行在客户端的,会影响到整个网页的在浏览器的解析效率,这样也可能暗示着会增加客户端的流量,所以不管是从服务器负载角度还是站在用户的角度来看,对客户端的代码进行优化都显得尤为重要!本文主要内部和外部两方面来阐述WEB前端优化的方法.希望能给读者一些体会和启发. 首先,我们通过一个雅虎的

javascript关于if语句优化的方法

UglifyJS是一个对javascript进行压缩和美化的工具,在它的文档说明中,我看到了几种关于if语句优化的方法.尽管我还没使用它去做一些尝试性的测试,但从这里可以看到它的确对js作了美化的工作.也许有人认为if语句就那么简单,能优化到什么程度?但是看看以下的几种方式,你也许会改变看法. 一.使用常见的三元操作符 if (foo) bar(); else baz(); ==> foo?bar():baz(); if (!foo) bar(); else baz(); ==> foo?ba

提升网页加载速度和体验 谈图片优化的方法

在网站优化中,如果图片优化得好,不但可以提高页面的加载速度,提升网站的用户体验,而且还可以通过图片优化来节省网站的带宽.那么作为页面构建工程师应该采用什么方法来优化图片,既能保证UI的还原度,又使图片最精简呢?下面我就个人经验,来简单介绍一下图片优化的方法,首先我们了解一些图片方面的知识: 1. 矢量图与位图. 矢量图:缩放.旋转不失真的图像格式,不管你离多近去看都看不到图形的最小单位.存储的文件较小,但是很难表现色彩层次丰富的逼真图像效果.你可以理解成完美的圆型.抛物线等形状. 位图:又叫栅格

javascript教程:关于if简写语句优化的方法_javascript技巧

UglifyJS是一个对javascript进行压缩和美化的工具,在它的文档说明中,我看到了几种关于if语句优化的方法.尽管我还没使用它去做一些尝试性的测试,但从这里可以看到它的确对js作了美化的工作.也许有人认为if语句就那么简单,能优化到什么程度?但是看看以下的几种方式,你也许会改变看法. 一.使用常见的三元操作符 if (foo) bar(); else baz(); ==> foo?bar():baz();if (!foo) bar(); else baz(); ==> foo?baz

谈谈动态、静态、伪静态三种网址模式的优化设置方法

摘要: 对于网站的网址而言,常见的网址模式主要分为三种:动态.静态.伪静态.而相应的每种网址模式又对应着相应的页面类型,就是咱们常说的静态页.动态页.伪静态页.当然在网站 对于网站的网址而言,常见的网址模式主要分为三种:动态.静态.伪静态.而相应的每种网址模式又对应着相应的页面类型,就是咱们常说的静态页.动态页.伪静态页.当然在网站优化中,站长都知道,其中静态模式的网址对于优化和用户体验都非常有帮助的,同时对于提高自己的网站知名度也是相当不错的.但是并非所有的网站都使用静态模式的网址就合适,就如

浅谈图片优化的方法

在网站优化中,如果图片优化得好,不但可以提高页面的加载速度,提升网站的用户体验,而且还可以通过图片优化来节省网站的带宽.那么作为页面构建工程师应该采用什么方法来优化图片,既能保证UI的还原度,又使图片最精简呢?下面我就个人经验,来简单介绍一下图片优化的方法,首先我们了解一些图片方面的知识: 1.&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;矢量图与位图. 矢量图:缩放.旋转不失真的图像格式,不管你离多近去看都看不