目錄
黃金分割法也稱爲中外比,指把一條線段分割爲兩部分,使其中一部分與全長之比等於另一部分與這部分之比。其比值是一個無理數,取其前三位數字的近似值是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;
}