多维优化:共轭梯度法

来源:互联网 发布:ubuntu查看gpu使用率 编辑:程序博客网 时间:2024/06/01 10:40
/*无约束多维优化*/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相当于p0k = 0;}//4)进行一维搜索,获得步长lamta,并更新xk此处为x0xk = x0;double l = 0;double u = 1e10;quadraticInterpolationSearch(fitFunc,l, u, lamta);//更新xk,此处为x0for(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);}

	
				
		
原创粉丝点击