📄 functionclose.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 + -