最优化方法一维搜索法C++程序
加步探索法
#include
#include
using namespace std;
double fun(double t)
{
return (t*t*t-2*t+1);
}
double max(double a,double b)
{
if(a>b)return a;
else return b;
}
double min(double a,double b)
{
if(a>b)return b;
else return a;
}
double Addstep(double(*pfun)(double t))
{
int k=0;
double t0=0,h=1,r=2,t,a=0,b=0;
t=t0+h;
do{
if(fun(t) else{if(k=0){h=-h;k++;} else{a=min(t0,t);b=max(t0,t);return a;return b;}} }while(a=b); cout<<" 探索区间为:"<<"["< int main() { Addstep(fun); return 0; } 对分法 #include #include using namespace std; double fun(double t) { return (t*t-3*t); } double dfun(double t) { return (2*t-3); } void Dichotomous(double(*pfun)(double t),double (*pdfun)(double t)) { int maxflag=1000,k=1; double a=-3,b=5,c,err=0.1,t; do { c=(a+b)/2; if(dfun(c)<0){a=c;} else {if(dfun(c)>0){b=c;} else{a=c;b=c;}} k++; }while(fabs(a-b)>err&&k if(k>=maxflag) cout< else { cout< cout<<" 函数值近似为:f(root)="< } } int main() { Dichotomous(fun,dfun); return 0; } Newton切线法 #include #include using namespace std; double fun(double t) { return (t*t*t-2*t+1); } double dfun(double t) { return (3*t*t-2); } void NewtonIterative(double(*pfun)(double t),double (*pdfun)(double t)) { int maxflag=1000,k=1; double t0=1,err=0.01,t; do { t0=t; t=t0-pfun(t0)/pdfun(t0); k++; }while(fabs(t-t0)>err&&k if(k>=maxflag) cout< else { cout< cout<<" 迭代结果:近似根为root="< cout<<" 函数值近似为:f(root)="< } } int main() { NewtonIterative(fun,dfun); return 0; } 黄金分割法 #include #include using namespace std; double fun(double t) { return (t*t+2*t); } void Goldensection(double(*pfun)(double t)) { int maxflag=1000,k=1; double a=-3,b=5,err=0.001,t,t1,t2; do { t1=a+0.618*(b-a); t2=b-0.618*(b-a); if(t1=t2){a=t2;b=t1;} else {if(t1 else{b=t1;}} k++; }while(fabs(a-b)>err&&k if(k>=maxflag) cout< { t=(a+b)/2; cout< cout<<" 迭代结果:近似根为root="< } int main() { Goldensection(fun); return 0; } 抛物线插值法 #include #include using namespace std; double fun(double x) { return (8*x*x*x-2*x*x-7*x+3); } double max(double a,double b) { if(a>b)return a; else return b; } double min(double a,double b) { if(a>b)return b; else return a; } void Parainterpolation(double(*pfun)(double x)) { double a=0,b=2,err=0.001,x=0,x0=1,f,f0; do { x=((x0*x0-b*b)*fun(a)+(b*b-a*a)*fun(x0)+(a*a-x0*x0)*fun(b))/(2*((x0-b)*fun(a)+(b-a)*fun(x0) +(a-x0)*fun(b))); f0=fun(x0); f=fun(x); if(f=f0){a=min(x,x0);b=max(x,x0);x0=(a+b)/2;} else { if((fun(x)-f0)*(x-x0)>0) { b=max(x,x0);x0=min(x,x0); } else { a=min(x,x0);x0=max(x,x0); } } }while(fabs(x-x0)>err); x=(x+x0)/2; cout<<" 迭代结果:近似根为root="< cout<<" 函数值近似为:f(root)="< } int main() { Parainterpolation(fun); return 0; } 短后的区间不大于区间[0,10]的5% 。 解:由题意=δ5%,由斐波那契数列δ1 ≥n F ,则n=7, 00=a ,100=b 1t =0b )(0076a b F F --=2180 , 21 130)(00760'1=-+=a b F F a t , 将1t 和'1t 代入函数,比较大小有)()('11t f t f < 则有001==a a ,21801'2==t t ,21130'11==t b ,21 50)(116512=--=a b F F b t , 将2t 和'2t 代入函数,比较大小有)()('22t f t f < , 则有012==a a ,21502'3==t t ,2180'22==t b ,21 30)(225423=--=a b F F b t , 将3t 和'3t 代入函数,比较大小有)()('33t f t f >, 则有213033==t a ,2150'34==t t ,218023==b b ,21 60)(33433'4=-+=a b F F a t , 将4t 和'4t 代入函数,比较大小有)()('44t f t f >, 则有215044==t a ,2160'45==t t ,218034==b b ,21 70)(44324'5=-+=a b F F a t , 将5t 和'5t 代入函数,比较大小有)()('55t f t f >, 则有216055= =t a ,2170'56==t t ,218045==b b , 则令105 351)21602180()01.05.0(2160))((55215'6=-?++=-++=a b F F a t ε, 将6t 和'6t 代入函数,比较大小有)()('66t f t f <, 则216056==a a ,105351'66==t b ,区间为:?? ????105351,2160 所以选择6t 为极小点,=)(6t f 89.6)2170( -=f 。 加步探索法 #include 对分法 #include 《机械优化设计》 实验报告 班级: 机械设计(2)班 姓名:邓传淮 学号:0901102008 1 实验名称:一维搜索黄金分割法求最佳步长 2 实验目的:通过上机编程,理解一维搜索黄金分割法的原理,了解计算机在优化设计中的应用。 3 黄金分割法的基本原理 黄金分割法是用于一元函数f(x)在给定初始区间[a,b]内搜索极小点α*的一种方法。它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算法的基础,但它只适用于一维区间上的凸函数[6],即只在单峰区间内才能进行一维寻优,其收敛效率较低。其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间[7]。具体步骤是:在区间[a,b]内取点:a1 ,a2 把[a,b]分为三段。如果f(a1)>f(a2),令a=a1,a1=a2,a2=a+r*(b-a);如果f(a1) 4实验所编程序框图(1)进退发确定单峰区间的计算框图 (2)黄金分割法计算框图 5 程序源代码 (1)进退发确定单峰区间的程序源代码 #include 无约束优化:不对定义域或值域做任何限制的情况下,求解目标函数的最小值。 这是因为实际应用中,许多情形被抽象为函数形式后均为凸函数,对于凸函数来说局部最小值点即为全局最小值点,因此只要能求得这类函数的一个最小值点,该点一定为全局最小值。 (直接法:又称数值方法,它只需计算目标函数驻点的函数数值,而不是求其倒数,如坐标轮换法,单纯型法等。 间接法:又称解析法,是应用数学极值理论的解析方法。首先计算出目标函数的一阶或一阶、二阶导数,然后根据梯度及海赛矩阵提供的信息,构造何种算法,从而间接地求出目标函数的最优解,如牛顿法、最速下降法共轭梯度法及变尺度法。) 在优化算法中保证整体收敛的重要方法就是线搜索法与信赖域法,这两种算法既相似又有所不同。根据不同的线搜索准则就延伸出不同的线搜索算法,譬如比较常见和经典的最速下降法,牛顿法,拟牛顿法以及共辄梯度法等。 一维搜索又称线性搜索(Line Search),就是指单变量函数的最优化,它是多变量函数最优化的基础,是求解无约束非线性规划问题的基本方法之一。 一维搜索技术既可独立的用于求解单变量最优化问题,同时又是求解多变量最优化问题常用的手段,虽然求解单变量最优化问题相对比较简单,但其中也贯穿了求解最优化问题的基本思想。由于一维搜索的使用频率较高,因此努力提高求解单变量问题算法的计算效率具有重要的实际意义。 在多变量函数的最优化中,迭代格式X k+1=X k+a k d k其关键就是构造搜索方向d k和步长因子a k 设Φ(a)=f(x k+ad k) 这样从凡出发,沿搜索方向d k,确定步长因子a k,使Φ(a)<Φ(0)的问题就是关于步长因子a的一维搜索问题。其主要结构可作如下概括:首先确定包含问题最优解的搜索区间,然后采用某种分割技术或插值方法缩小这个区间,进行搜索求解。 一维搜索通常分为精确的和不精确的两类。如果求得a k使目标函数沿方向d k达到 极小,即使得f (x k+a k d k)=min f (x k+ ad k) ( a>0) 则称这样的一维搜索为最优一维搜索,或精确一维搜索,a k叫最优步长因子; 如果选取a k使目标函数f得到可接受的下降量,即使得下降量f (x k)一f (x k+a k d k)>0是用 户可接受的,则称这样的一维搜索为近似一维搜索,或不精确一维搜索,或可接受一维 搜索。 由于在实际计算中,一般做不到精确的一维搜索,实际上也没有必要做到这一点,因为精确的 三点一维搜索法报告 姓名:张攀班级:2009211102 学号:09210048 算法的基本思想: 三点一维算法是从0.618法衍生而来的,0.618算法使用从两点a,b间选择两个点c,d将原来区域分为三个,抛弃不符合所求数值趋势的两个区域,不断逼近所求值,当|b-a| 实例分析: 选择函数:f[x] := Sin[x^4] + Cos[x] 该函数在[0,1]范围内有极小值,令a=0,b=1,p=0.1,e选取1*10^(-9),运算后结果在x=0.4904089750976563时有最小值0.939949。运算次数为22次, P值选取效率的影响: 在该函数中,[0,1]内函数波动较为平缓,从中间缓慢向两边扩展显然速度较快,因为所求点接近终点,当p增大的时能很快覆盖到所求点效率将变高,如果区域远超过所求点则效率将变低。 P取值以及逼近次数i的关系: P=0.1,i=22 P=0.2,i=26 P=0.25,i=19 P=0.3,i=19 P=0.35,i=21 P=0.4,i=23 P=0.5,i=26 P=0.6,i=30 P=0.7,i=36 P=0.8,i=57 可见最好的取值应为0.25到0.3之间。 总结: 三点一维算法实际通过多次比较,减少了0.618法对点的移动,和对区域的选择,比0.618法稳定。在比较区域大时三点一维算法比起0.618法更加优秀。 第5章 一维搜索 §5.1 最优化算法的简单介绍 1.算法概念 在解非线性规划时,所用的计算方法,最常见的是迭代下降算法. 迭代:从一点) (k x 出发,按照某种规则A 求出后继点) 1(+k x .用1+k 代替k ,重复以上 过程,产生点列}{) (k x 。 规则A 是在某个空间X 中点到点的映射,即对每一个X x k ∈) (,有点 X x A x k k ∈=+)() () 1(. 更一般地,把A 定义为点到集的映射,即对每个点X x k ∈) (,经A 作用,产生一个点 集X x A k ?)() (.任意选取一个点)() () 1(k k x A x ∈+,作为) (k x 的后继点. 定义1: 算法A 是定义在空间X 上的点到集映射,即对每一个点X x ∈,给定-个子集 X x A ?)(. 例1 考虑线性规划: 1 s.t. min 2 ≥x x 最优解1=x .设计一个算法A 求出这个最优解. ??????????? ?+≥??? ???+=1 ,1 ),1(211 ,)1(21 ,1x x x x A 从一点出发,经A 作用得到一个闭区间.从此区间中任取一点作为后继点,得到一个点列.在一定条件下,该点列收敛于问题的解.利用算法A 可以产生不同的点列,如以3=x 为起点可产生点列: {} ,5/4 ,3/2 ,2 ,3 其聚点是问题的最优解. 在许多情况下,要使算法产生的点列收敛于全局最优解是比较困难的.因此,一般把满足某些条件的点集定义为解集合.当迭代点属于这个集合时,就停止迭代.斐波那契法 一维搜索方法
最优化方法一维搜索法C++程序
机械优化设计一维搜索实验报告
常用一维搜索算法
三点一维搜索法报告
第5章 一维搜索