天天看點

黃金分割(0.618)法求解函數極值(附代碼)

目錄

黃金分割法

疊代公式

算法步驟:

例題

C++代碼:

黃金分割法也稱為中外比,指把一條線段分割為兩部分,使其中一部分與全長之比等于另一部分與這部分之比。其比值是一個無理數,取其前三位數字的近似值是0.618,是以也稱為0.618法。

黃金分割法

黃金分割(0.618)法求解函數極值(附代碼)

疊代公式

黃金分割(0.618)法求解函數極值(附代碼)

算法步驟:

step1.給定初始搜尋區間

黃金分割(0.618)法求解函數極值(附代碼)

和允許精度

黃金分割(0.618)法求解函數極值(附代碼)

step2.計算初始值

黃金分割(0.618)法求解函數極值(附代碼)

step3.開始循環k=k+1,轉step4,若

黃金分割(0.618)法求解函數極值(附代碼)

則退出循環,轉step7.

step4 判斷

黃金分割(0.618)法求解函數極值(附代碼)

,是轉step5,否轉step6;

step5.令

黃金分割(0.618)法求解函數極值(附代碼)
黃金分割(0.618)法求解函數極值(附代碼)
黃金分割(0.618)法求解函數極值(附代碼)

step6.令

黃金分割(0.618)法求解函數極值(附代碼)
黃金分割(0.618)法求解函數極值(附代碼)
黃金分割(0.618)法求解函數極值(附代碼)

step7.極值點為:                                                                   

黃金分割(0.618)法求解函數極值(附代碼)

例題

求解函數

黃金分割(0.618)法求解函數極值(附代碼)

在區間[-1,3]上的極小點,要求求解的區間精度小于0.001倍。

程式求解結果如圖:

黃金分割(0.618)法求解函數極值(附代碼)

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;
}
           

繼續閱讀