进退法例子,遇到具体问题还得修改,以后最速下降梯度法的梯度方向是变化的,这是其中一个要考虑的改变。进退法具体算法:
实现代码:
#include "StdAfx.h" #include <stdio.h> #include <iostream> #include <Windows.h> #define N 2 using namespace std; float testFunction(float z[N]){ float f; f = z[0] * z[0] + z[1] * z[1] - 8 * z[0] - 12 * z[1] + 52; //函数 return(f); } void main(){ float x[N],s[N],f[N],z[N],t,a,b; // x保存初始点坐标,s保存搜索方向,f保存x_k+1和x的对应函数值,z表示更新后的坐标 // t表示步长的每次迭代的增量,a和b保存搜索区间 for(int i = 0; i < N; i++){ cout << "请输入初始点x[" << i << "] = " << endl; cin >> x[i]; } cout << "请输入步长增量: " << endl; cin >> t; for(int i = 0; i < N; i++){ cout << "请输入搜索方向s[" << i << "] = " << endl; cin >> s[i]; } a = 0; b = t; f[0] = testFunction(x); for(int i = 0; i < N; i++) z[i] = x[i] + b * s[i]; f[1] = testFunction(z); if(f[1] < f[0]){ do{ t = 2 * t; b = b + t; f[0] = f[1]; for(int i = 0; i < N; i++) z[i] = z[i] + b * s[i]; f[1] = testFunction(z); if(f[0] > f[1]) a = b - t; else break; }while(f[0] > f[1]); cout << "A = " << a << "B = " << b << endl; } else{ t = 0 - t; do{ a = a + t; f[1] = f[0]; for(int i = 0; i < N; i++) z[i] = z[i] + a * s[i]; f[0] = testFunction(z); if(f[1] > f[0]){ b = a - t; t = 2 * t; } else break; }while(f[1] > f[0]); cout << "A = " << a << " B = " << b << endl; } system("pause"); }