MultidimensionalOptimization.h #ifndef _MultidimensionalOptimization_ #define _MultidimensionalOptimization_ #include <vector> #include <stdio.h> #include "OneDimensionalOptimization.h" using namespace std; class MultidimensionalOptimization : public OneDimensionalOptimization { public: //最速下降法 MultidimensionalOptimization(); double norm2(double* vec, int n); //计算vec中2的范数 double steepestDescent(double(*p)(double* x),double* x0,int n,double tol = 1e-6); double* gradient(double(*p)(double* x),double* x0, int n, double size = 1e-10); //计算搜索方向,即负梯度 void testSteepestDescent(); }; #endif MultidimensionalOptimization.cpp #include "MultidimensionalOptimization.h" double* xv = NULL; double* xk = NULL; double* vk = NULL; int paraNum = 0; double(*point)(double* x) ; double fitFunc(double x) { double* xv = new double[paraNum]; for(int i =0; i < paraNum; i++) { xv[i] = xk[i] + x * vk[i]; } double y = point(xv); return y; } MultidimensionalOptimization::MultidimensionalOptimization() { xk = NULL; vk = NULL; } //最速下降法 double* MultidimensionalOptimization::gradient(double(*p)(double* x),double* x0, int n, double size) //计算目标函数的负梯度 { double* grads = new double[n]; for(int k = 0; k < n; k++) { double* delx = new double[n]; memcpy (delx, x0, sizeof(*x0)*n ); delx[k] += size; double delObjFun = p(x0) - p(delx); grads[k] = (-delObjFun / size); delete[] delx; } return grads; } double MultidimensionalOptimization::norm2(double* vec,int n) //计算vec中2的范数 { double res = 0.0; for(int i = 0; i < n; i++) { res += vec[i] * vec[i]; } return sqrt(res); } double MultidimensionalOptimization::steepestDescent(double(*p)(double* x),double* x0, int n,double tol) { paraNum = n; point = p; double lamta = 0; while(true) { //1)计算搜索方向 double* direction = gradient(p , x0, n); //2)判断搜索方向是否满足收敛条件 double conver = norm2(direction,n); if(conver < tol) break; //3)进行一维搜索 xk = x0; vk = direction; double l = 0; double u = 1e10; quadraticInterpolationSearch(fitFunc,l, u, lamta); //4)更新xk,此处为x0 for(int i = 0; i < n; i++) { x0[i] += lamta * vk[i]; } delete[] direction; } return p(x0); } double steepestDescentFunc(double*x) { return (x[0]-4)*(x[0]-4) + (x[1]+2)* (x[1]+2) + 1; } //测试代码,调用此函数即可 void MultidimensionalOptimization::testSteepestDescent() { double x0[2] ={1.0,-3.0}; double r = steepestDescent(steepestDescentFunc,x0,2,1e-6); }