目录
黄金分割法也称为中外比,指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。其比值是一个无理数,取其前三位数字的近似值是0.618,所以也称为0.618法。
黄金分割法
迭代公式
算法步骤:
step1.给定初始搜索区间和允许精度
step2.计算初始值
step3.开始循环k=k+1,转step4,若则退出循环,转step7.
step4 判断,是转step5,否转step6;
step5.令
step6.令
step7.极值点为:
例题
求解函数在区间[-1,3]上的极小点,要求求解的区间精度小于0.001倍。
程序求解结果如图:
C++代码:
#include <iostream>
#include <vector>
#include <iomanip> //参数化输入/输出
using namespace std;
double fx(double x)
{
double fx;
fx = pow(x, 2) - x + 2;
return fx;
}
int main()
{
double epsilon = 0.001, f_min,tau=0.618;
double a_gss= -1.0, b_gss = 3.0, f_lambda = 0, f_mu = 0;
double lambda = a_gss+(1.0- tau)*(b_gss-a_gss), mu = a_gss +tau*(b_gss - a_gss);
f_lambda= fx(lambda), f_mu = fx(mu);
for (int i = 0; fabs(mu- lambda) >epsilon; i++)
{
if (f_lambda < f_mu)
{
a_gss = a_gss, b_gss = mu, mu = lambda, f_mu = f_lambda;
lambda = a_gss + (1.0 - tau)*(b_gss - a_gss);
f_lambda = fx(lambda);
}
else
{
a_gss = lambda, b_gss = b_gss, lambda = mu, f_lambda = f_mu;
mu = a_gss + tau * (b_gss - a_gss);
f_mu = fx(mu);
}
cout << fixed << setw(12) << setprecision(5) << a_gss << fixed << setw(12) << setprecision(5) << lambda << fixed << setw(12) << setprecision(5) << mu << fixed << setw(12) << setprecision(5) << b_gss << endl;
}
f_min = fx(0.5*(lambda + mu));
cout << endl << "极小值区间:" << fixed << setw(9) << setprecision(5) << lambda << fixed << setw(12) << setprecision(5) << mu << endl;
cout << "极小值: " << fixed << setw(12) << setprecision(5) << f_min << endl;
}