C++实现黄金分割法搜索

今天上最优化数学课的时候,老师讲的是黄金分割法。布置作业要求用该方法求一个函数的最优值,但是区间长度比原题缩小了十倍,感觉迭代次数可能会增加很多,按计算器很麻烦,只好用c++帮忙算中间结果了。代码如下:
#include <iostream>
#include <math.h>
using namespace std;
double f(double x)
{	 
	return (exp(-x)+x*x);
}
void solve(double e, double am,double bm,bool opt)
{
	double k,k1,k2,a1=am,b1=bm;
	int count=0;
	if(opt)
	{
		k=(sqrt(5.0)-1)/2;
	}
	else
	{
		k=0.618;
	}
	while((b1-a1-e)>0.000000001)
	{	count+=1;
		cout<<"第"<<count<<"次迭代:"<<endl;
		k1=a1+(b1-a1)*(1-k);
		k2=a1+(b1-a1)*k;
		cout<<"k1="<<k1<<"\tk2="<<k2<<endl;
		cout<<"f(k1)="<<f(k1)<<"\tf(k2)="<<f(k2)<<endl;
		if(f(k1)-f(k2)>0)
		{
			a1=k1;
			cout<<"f(k1)>f(k2)"<<endl;
		}
		else
		{
			b1=k2;
			cout<<"f(k1)<f(k2)"<<endl;
		}
		cout<<"a="<<a1<<"\tb="<<b1<<endl;
	}
	cout<<"迭代次数为"<<count<<"\n最优解为"<<((a1+b1)/2)<<"\n最优值为:"<<f((a1+b1)/2)<<endl;
}
void main()
{
	double er,a,b;
	bool option;
	while(1)
	{
		cout<<"请输入精确度:";
		cin>>er;
		cout<<"选择黄金分割系数:0->0.618;1->(sqrt(5)-1)/2"<<endl;
		cin>>option;
		cout<<"输入初始区间端点:"<<endl;
		cin>>a>>b;
		solve(er,a,b,option);
	}
}
由于为了赶作业,所以代码写的很潦草,将就着用吧。结果显示前几步迭代和标准答案一模一样。
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值