牛顿法(newton's method)求解函数极值

5 篇文章 0 订阅
3 篇文章 0 订阅
// 目标函数:f(x1, x2, x3, x4) = (x1 + 10*x2)^2 + 5*(x3 - x4)^2 + (x2 - 2*x3)^4 + 10.0*(x1 - x4)^4; 求取输入向量x?
// 牛顿法:  x(k+1) = x(k) - inv(F(x(k))) * g(x(k)), F是黑塞矩阵,g是导数;
double CPowell::ComputePowellFunc(float x[])
{
	double dx[4] = {x[0], x[1], x[2], x[3]};
	double dResult = pow(dx[0] + 10 * dx[1], 2) + 5 * pow(dx[2] - dx[3], 2) + pow(dx[1] - 2 * dx[2], 4) + 10.0 * pow(dx[0] - dx[3], 4);
	return dResult;
}
</pre><pre code_snippet_id="1835287" snippet_file_name="blog_20160817_4_2022945" name="code" class="html">
<span style="white-space:pre">	</span>CPowell oPowell;
	// 初始值
	float x[4] = {3.0, -1.0, 0.0, 1.0};

	for (int i=0; i<3; i++)
	{
		Eigen::VectorXf vecOld = Map<VectorXf>(x, 4);
		float fGraident[4] = {0.0};
		oPowell.ComputeGraident(x, 4, fGraident);

		Eigen::VectorXf vecGradient = Map<VectorXf>(fGraident, 4);

		float fHessian[4][4] = {0.0};
		oPowell.ComputeHessian(x, 4, &fHessian[0][0]);

		MatrixXf matHessian = Map<MatrixXf>(fHessian[0], 4, 4);   //动态矩阵,建立3行4列。
		Eigen::VectorXf vecNew = vecOld - matHessian.inverse() * vecGradient;

		cout<<"第"<<i<<"次迭代"<<endl;
		cout<<vecNew<<endl<<endl;

		for (int j=0; j<4; j++)
		{
			x[j] = vecNew(j);
		}

		cout<<"函数值为:"<<oPowell.ComputePowellFunc(x)<<endl<<endl;
	}

 

我的思路是这样的: 最速下降法能找出全局最优点,但在接近最优点的区域内就会陷入“齿型”迭代中,使其每进行一步迭代都要花掉非常久的时间,这样长久的等待是无法忍受的,不信你就在我那个程序的第一步迭代中把精度取得很小如:0.000000001等,其实我等过一个钟都没有什么结果出来。 再者我们考究一下 牛顿迭代法求最优问题,牛顿法相对最速下降法的速度就快得多了,而且还有一个好处就是能高度逼近最优值,而不会出现死等待的现象。 如后面的精度,你可以取如:0.0000000000001等。 但是牛顿法也有缺点,就是要求的初始值非常严格,如果取不好,逼近的最优解将不收敛,甚至不是最优解。 就算收敛也不能保证那个结就是全局最优解,所以我们的出发点应该是:为牛顿法找到一个好的初始点,而且这个初始点应该是在全局最优点附近,这个初始点就能保证牛顿法高精度收敛到最优点,而且速度还很快。 思路概括如下: 1。用最速下降法在大范围找到一个好的初始点给牛顿法:(最速下降法在精度不是很高的情况下逼近速度也是蛮快的) 2。在最优点附近改用牛顿法,用最速下降法找到的点为牛顿法的初始点,提高逼近速度与精度。 3。这样两种方法相结合,既能提高逼近的精度,还能提高逼近的速度,而且还能保证是全局最优点。这就充分吸收各自的优点,扬长避短。得到理想的结果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值