今天上最优化数学课的时候,老师讲的是黄金分割法。布置作业要求用该方法求一个函数的最优值,但是区间长度比原题缩小了十倍,感觉迭代次数可能会增加很多,按计算器很麻烦,只好用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);
}
}
由于为了赶作业,所以代码写的很潦草,将就着用吧。结果显示前几步迭代和标准答案一模一样。