目录

黄金分割法

迭代公式

算法步骤:

例题

C++代码:


黄金分割法也称为中外比,指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。其比值是一个无理数,取其前三位数字的近似值是0.618,所以也称为0.618法

黄金分割法

                        \tau =\frac{-1+\sqrt{5}}{2}\approx 0.618

迭代公式

\left\{\begin{matrix} \lambda _{k}=a_{k}+(1-\tau )(b_{k}-a_{k}),k=1,2,...,n-1\\ \mu _{k}=a_{k}+\tau(b_{k}-a_{k}),k=1,2,...,n-1 \end{matrix}\right.

算法步骤:

step1.给定初始搜索区间[a_{1},b_{1}]和允许精度\varepsilon<0.001,\tau =0.618

step2.计算初始值

                                \left\{\begin{matrix} \lambda _{1}=a_{1}+(1-\tau )(b_{1}-a_{1})\\\mu _{1}=a_{1}+\tau(b _{1}-a_{1})\\f_{\lambda }=f(\lambda _{1})\\f_{\mu }=f(\mu _{1}) \end{matrix}\right.

step3.开始循环k=k+1,转step4,若\left | \lambda _{k}-\mu _{k} \right |\leq \varepsilon则退出循环,转step7.

step4 判断f_{\lambda }<f_{\mu }?,是转step5,否转step6;

step5.令

               a_{k+1}=a_{k},b_{k+1}=\mu _{k},\mu _{k+1}=\lambda _{k},f_{\mu }=f_{\lambda }

               \lambda _{k+1}=a_{k+1}+(1-\tau )(b_{k+1}-a_{k+1})

               f_{\lambda }=f(\lambda _{k +1})

step6.令

               a_{k+1}=\lambda _{k},b_{k+1}=b _{k},\lambda _{k+1}=\mu _{k},f_{\lambda }=f_{\mu }

               \mu _{k+1}=a_{k+1}+\tau (b_{k+1}-a_{k+1})

               f_{\mu }=f(\mu _{k +1})

step7.极值点为:                                                                   

                         f_{min}=f(\frac{\lambda _{n}+\mu _{n}}{2})

例题

求解函数f(x)=x^{2}-x+2在区间[-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;
}

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐