⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 functionclose.cpp

📁 最优化理论与算法(第2版)这本书中的课后作业。用C++实现的一些具体算法。
💻 CPP
字号:
#include<iostream.h>
#include<math.h>

//p333,作业2
void main()
{
//牛顿法求最小值
double x0=-1.2;
int k=0;
double temp,ans,value;

ans=x0;
for(k=0;k<3;k++)
{
	temp=ans;
	ans=temp-(12*pow(temp,3)-9*pow(temp,2)-24*temp)/(36*pow(temp,2)-18*temp-24);
}
value=3*pow(ans,4)-3*pow(ans,3)-12*pow(ans,2);

cout<<"\n牛顿法:3次迭代后估计解为"<<ans<<",近似极小值为"<<value<<".\n";

//割线法求最小值
double x1=-1.2,x2=-0.8;
int k1=0;
double temp1,temp2,ans1,value1;

temp1=x1;temp2=x2;
for(k1=0;k1<3;k1++)
{
	ans1=temp2-(temp2-temp1)*(12*pow(temp2,3)-9*pow(temp2,2)-24*temp2)/((12*pow(temp2,3)-9*pow(temp2,2)-24*temp2)-(12*pow(temp1,3)-9*pow(temp1,2)-24*temp1));
	temp1=temp2;
	temp2=ans1;
}
value1=3*pow(ans1,4)-3*pow(ans1,3)-12*pow(ans1,2);
cout<<"\n割线法:3次迭代后估计解为"<<ans1<<",近似极小值为"<<value1<<".\n";

//抛物线法求最小值
double xx1=-1.2,xx2=-1.1,xx3=-0.8;
int k2=0;
double tempt[4],ans2,value2;
double b1,b2,b3,c1,c2,c3;

tempt[1]=xx1;tempt[2]=xx2;tempt[3]=xx3;
for(k2=0;k2<3;k2++)
{
b1=(pow(tempt[2],2)-pow(tempt[3],2))*(3*pow(tempt[1],4)-3*pow(tempt[1],3)-12*pow(tempt[1],2));
b2=(pow(tempt[3],2)-pow(tempt[1],2))*(3*pow(tempt[2],4)-3*pow(tempt[2],3)-12*pow(tempt[2],2));
b3=(pow(tempt[1],2)-pow(tempt[2],2))*(3*pow(tempt[3],4)-3*pow(tempt[3],3)-12*pow(tempt[3],2));
c1=(tempt[2]-tempt[3])*(3*pow(tempt[1],4)-3*pow(tempt[1],3)-12*pow(tempt[1],2));
c2=(tempt[3]-tempt[1])*(3*pow(tempt[2],4)-3*pow(tempt[2],3)-12*pow(tempt[2],2));
c3=(tempt[1]-tempt[2])*(3*pow(tempt[3],4)-3*pow(tempt[3],3)-12*pow(tempt[3],2));

tempt[4]=(b1+b2+b3)/(c1+c2+c3)/2;
ans2=tempt[4];
double temp2;

for(int i=1;i<4;i++)   //冒泡排序法,对x1,x2,x3,xk按升序排
{
	for(int j=0;j<4-i;j++)
		if(tempt[j]>tempt[j+1])
		{
			temp2=tempt[j];
			tempt[j]=tempt[j+1];
			tempt[j+1]=temp2;
		}
}

double valuearray[4];
double min=65535;
int num=0;

for(int ki=0;ki<4;ki++)
{
	valuearray[ki]=3*pow(tempt[ki],4)-3*pow(tempt[ki],3)-12*pow(tempt[ki],2);
}

for(int kj=0;kj<4;kj++)  //从x1,x2,x3,xk中找出使目标函数值最小的点及左右点
{
	if(valuearray[kj]<min)
	{
		min=valuearray[kj];
		num=kj;
	}
}
tempt[1]=tempt[num-1];
tempt[2]=tempt[num];
tempt[3]=tempt[num+1];
}
value2=3*pow(ans2,4)-3*pow(ans2,3)-12*pow(ans2,2);

cout<<"\n抛物线法:3次迭代后估计解为"<<ans2<<",近似极小值为"<<value2<<".\n"<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -