工程优化课程学了进退法、黄金分割法、二次插值法、三次插值法、最速下降法。我自己只测试用最速下降法求(恩,水货我只调试了这一个,调了好多次才调通,然后其他的也没心情调试了):minf(x) = x1^2 + 25*x2^2,得到结果如下图所示,与该函数的极小值点(0,0)在精度误差之内。
#ifndef ENGINEERINGOPTIMIZATION_H_INCLUDED
#define ENGINEERINGOPTIMIZATION_H_INCLUDED
#include <vector>
using std::vector;
/* description:区间类
*/
class Region
{
public:
double frontierLow; //一维定义域下界
double frontierHigh; //一维定义域上界
vector<double> lowerBoundDomain; //n维矢量下界
vector<double> upperBoundDomain; //n维矢量上界
Region() {}
Region(double l, double h)
{
frontierLow = l;
frontierHigh = h;
}
Region(double l, double h, vector<double> lowerBound,
vector<double> upperBound)
{
frontierLow = l;
frontierHigh = h;
lowerBoundDomain = lowerBound;
upperBoundDomain = upperBound;
}
Region(vector<double> lowerBound, vector<double> upperBound)
{
lowerBoundDomain = lowerBound;
upperBound = upperBoundDomain;
}
Region(const Region ®ion)
{
frontierLow = region.frontierLow;
frontierHigh = region.frontierHigh;
lowerBoundDomain = region.lowerBoundDomain;
upperBoundDomain = region.upperBoundDomain;
}
};
/* @description 计算n维矢量的模值
**
*/
double vectorMag(const vector<double> &v);
/*
** @description 进退法求搜索区间。
** @param initialPoint 搜索初始点
** @param initialStep 搜索初始步长
** @param targetFunc 目标函数f(x)的回调函数,调用者需要提供此函数。
** 它接受一个参数,变量x,返回目标函数的函数值
** @return 返回搜索到的区间
*/
//变量x是一维空间中的点
Region computeSearchRegion(double initialPoint, double initialStep, double (*targetFuc)(double x, int derivationOrder));
/*
** @description 黄金分割法求最小值,目标函数需是单峰函数。缩短搜素区间的三个原则(a<=x<=b):
** 1、“去坏留好”原则,若f(x1)<f(x2),则a<x_min<x2
** 2、对称原则,x1-a = b-x2
** 3、等比收缩原则,每次留下区间的长度都是上次留下区间长度的w倍(0<w<1)
** 调用者需提供目标函数
** @param region 目标函数的定义域
** @param pre