/* 无约束多维优化 */ MultidimensionalOptimization.h
#ifndef _MultidimensionalOptimization_ #define _MultidimensionalOptimization_ #include <vector> #include <stdio.h> #include "OneDimensionalOptimization.h" using namespace std; class MultidimensionalOptimization : public OneDimensionalOptimization { public: //共轭梯度法 double conjugateGradient(double(*p)(double* x),double* x0,int n,double tol = 1e-6); void testConjugateGradient(); }; #endif
MultidimensionalOptimization.cpp
#include "MultidimensionalOptimization.h"
//共轭梯度法 double MultidimensionalOptimization::conjugateGradient(double(*p)(double* x),double* x0,int n,double tol) { paraNum = n; point = p; double lamta = 0; //2)计算搜索方向,如果搜索方向向量2的范数小于一定误差,则停止迭代 double* direction = gradient(p , x0, n); double conver = norm2(direction,n); delete[] direction; //释放内存空间 if(conver < tol) return p(x0); bool s7 = false; double k; while(true) { //3)取vk等于负梯度 if(!s7) { vk = gradient(p , x0, n);; //vk相当于p0 k = 0; } //4)进行一维搜索,获得步长lamta,并更新xk此处为x0 xk = x0; double l = 0; double u = 1e10; quadraticInterpolationSearch(fitFunc,l, u, lamta); //更新xk,此处为x0 for(int i = 0; i < n; i++) { x0[i] += lamta * vk[i]; } double normk = norm2(direction,n); delete[] direction; //5)计算在x(k+1)处的负梯度,如果其2的范数满足收敛条件结束迭代 direction = gradient(p , x0, n); double normkp1 = norm2(direction,n); if(normkp1 < tol) break; //6) if(k + 1 == n)//满足条件转3),否则转7) s7 = false; continue; //7) k = k + 1; double lamdak = normkp1 / normk; for(int i = 0; i < n; i++) { vk[i] = direction[i] + lamdak * vk[i]; } delete[] direction; s7 = true; } return p(x0); } //测试代码void MultidimensionalOptimization::testConjugateGradient() { double x0[2] ={1.0,-3.0}; double r = conjugateGradient(steepestDescentFunc,x0,2,1e-6); }