工程优化作业——成功失败法和黄金分割法

来源:互联网 发布:守望先锋源氏cos淘宝网 编辑:程序博客网 时间:2024/06/05 01:18

工程优化作业——成功失败法和黄金分割法

西电工程优化作业编程题,写篇博客是为了熟悉MarkDown公式编写的方式。


  • 工程优化作业成功失败法和黄金分割法
    • 搜索方法概述
    • 成功失败法
      • 问题
      • 成功失败法的步骤
    • 618法黄金分割法
      • 缩短搜索区间的原则
    • 代码实现上述两种方法

搜索方法概述

求多元函数的极值点常采用迭代法,基本思想是先选择f(x)的极小点的一个初始点x0,逐次产生一系列的点x0,x1,,xk,使得:

f(x0)>f(x1)>>f(xk)>

并希望点列{xk}的极限就是f(x)的极小值点x
根据不同的原则选择不同的pk(pk称为搜索方向),就得到不同的算法,这种求α使得f(xk+αpk)为极小的过程,叫做一维搜索一维最优化

成功失败法

问题

设问题为:

minaxb{f(x)}

并令:
F(x)={f(x),+,axb

显然:

minaxb{f(x)}=minxR1{F(x)}

成功失败法的步骤

前进运算
先计算f(a),f(a+h)f(a)>f(a+h),则步长加倍,计算f(a+3h),若f(a+h)f(a+3h),则c=a,d=a+3h,否则,步长再加倍并重复上述运算。
后退运算
f(a)>f(a+h),则将步长缩减为原来的14,并改变符号,即将步长改为h4,若f(a)<f(ah4)c=ah4,d=a+h,否则将步长加倍,并继续后退。

0.618法(黄金分割法)

首先条件是f(x)[a,b]上的单峰函数

缩短搜索区间的原则

f(x)[a,b]上为单峰函数,最小点为x,在(a,b)上任取两点a<x1<x2<b,计算f(x1)f(x2)

“去坏留好”原则

f(x1)<f(x2),则x[a,x2]
f(x1)f(x2),则x[x1,b]

对称原则

由于在计算前不能预测x1,x2,为了稳妥,我们有:

x1a=bx2

则有:
x2=a+bx1

等比收缩原则

我们希望每次留下的区间长度都是上次留下的区间长度的w(0<w<1)w为常数。
设:ln是第n次比较函数值后留下区间的长度,我们希望ln+1=wln
根据计算得到:
w=1±52(1)

代码实现上述两种方法

f(x)=x4+x3x2+1,ε=102

#include<iostream>#include <algorithm>#include<cmath>#include <iomanip>using namespace std;double  f(double x){    return pow(x, 4) + pow(x, 3) - pow(x, 2) + 1;}//define f(x)int main(){    //成功失败法    double a;    double h;    cout << "input: " << endl << "a: ";    cin >> a;    cout << "h: ";    cin >> h;    double a1 = a;    double a2 = a + h;    double f1 = f(a1);    double f2 = f(a2);    double c;    double d;    if (f2 < f1)    {        h = 2 * h;        a2 += h;        f1 = f2;        f2 = f(a2);        while (f2 < f1)        {            a1 = a2 - h;            h = 2 * h;            a2 += h;            f1 = f2;            f2 = f(a2);        }// end while        c = a1;        d = a2;    }    else    {        h = -h / 4;        a1 = a1 + h;        f2 = f1;        f1 = f(a1);        while (!(f2 < f1))        {            a2 = a1 - h;            h = h + h;            a1 = a1 + h;            f2 = f1;            f1 = f(a1);        }//end while        c = a1;        d = a2;    }//end if-else    cout << "[ " << fixed << setprecision(2) << c << " ," << fixed << setprecision(2) << d << " ]" << endl;//output    //0.618法    double E = 0.01;    double x_result;    double _a = c;    double _b = d;    double x1 = _a + 0.382*(_b - _a);    double x2 = _a + _b - x1;    double R;    double G;    R = f(x1);func1:    G = f(x2);func2:    if (R > G)    {        _a = x1;        if (abs(_a - _b) < E)        {            x_result = (_a + _b) / 2;        }        else        {            x1 = x2;            x2 = _a + 0.618*(_b - _a);            R = G;            goto func1;        }    }    else    {        _b = x2;        if (abs(_b - _a) < E)        {            x_result = (_a + _b) / 2;        }        else        {            x2 = x1;            x1 = _a + 0.382*(_b - _a);            G = R;            R = f(x1);            goto func2;        }    }    cout << "x*=" << fixed<<setprecision(2)<<x_result << endl;    system("PAUSE");    return 0;}
1 0
原创粉丝点击