现在的位置: 首页 > 综合 > 正文

多维优化:共轭梯度法

2018年02月20日 ⁄ 综合 ⁄ 共 1498字 ⁄ 字号 评论关闭
/*
无约束多维优化
*/

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);
}


抱歉!评论已关闭.