/*
无约束多维优化
*/
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);
}