0.618 method iteratively finds the approximate minimum point

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<stdio.h>
#include<fstream>
using namespace std;
#define F(x) x*x*x-2*x+1//修改函数

int main()
{
    double epison = 0.05;
    double a[10] = { 0 };
    double b[10] = { 0 };
    double p[10] = { 0 };
    double q[10] = { 0 };
    a[0] = 0;
    b[0] = 3;
    p[0] = a[0] + 0.382 * (b[0] - a[0]);
    q[0] = a[0] + 0.618 * (b[0] - a[0]);
    int j = 1;
    printf("a[0]=%.6lf\t b[0]=%.6lf\t p[0]=%.6lf\t q[0]=%.6lf\n", a[0],  b[0],  p[0], q[0]);
    while (1 && j<10)
    {
        if (F(p[j - 1]) <= F(q[j - 1]))
        {
            if (abs(q[j - 1] - a[j - 1]) < 0.15)//修改精度
            {
                cout <<"STOP!!!!!!!"<<endl;
                break;
            }
            else
            {
                b[j] = q[j-1];
                a[j]= a[j-1];
                p[j] = a[j] + 0.382 * (b[j] - a[j]);
                q[j] = a[j] + 0.618 * (b[j] - a[j]);
            }
        }
        else
        {
            if (abs(b[j - 1] - p[j - 1]) < 0.15)//修改精度
            {
                cout << "STOP!!!!!!!" << endl;
                break;
            }
            else
            {
                b[j] = b[j - 1];
                a[j] = p[j - 1];
                p[j] = a[j] + 0.382 * (b[j] - a[j]);
                q[j] = a[j] + 0.618 * (b[j] - a[j]);
            }
        }
        printf("a[%d]=%.6lf\t b[%d]=%.6lf\t p[%d]=%.6lf\t q[%d]=%.6lf\n", j, a[j], j, b[j], j, p[j], j, q[j]);
        j++;
    }
    system("pause");
    return 0;
}

Guess you like

Origin blog.csdn.net/yoonaanna/article/details/128956929