进退法例子

进退法例子,遇到具体问题还得修改,以后最速下降梯度法的梯度方向是变化的,这是其中一个要考虑的改变。进退法具体算法:

实现代码:

#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");
}
原文地址:https://www.cnblogs.com/Key-Ky/p/3427544.html