优化设计VC6.0二次插值法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:利用二次插值法求()f sin αα=在4≤α≤5上的极小点。
利用VC++6.0进行编程,求得极小点。具体程序如下说明。
一、 二次插值法
求解原理:在求解一元函数的极小点时,常常利用一个低次插值多项式 来逼近原目标函数,然后求该多项式的极小点(低次多项式的极小点比较容易计算),并以此作为目标函数的近似极小点。如果其近似的程度尚未达到所要求的精度时,可以反复使用此法,逐次拟合,直到满足给定的精度时为止。二次差值的程序流程图
程序如下:
#include "stdio.h"
#include "math.h"
#define f(x) sin(x)//宏定义函数f(x)
int main()
{
//////////////////////////////////////////////////////////////////////////二次插值法
printf("*************************************二次插值法************************************\n");
float m1=4,m2=4.5,m3=5,w=1,s;
float h1,h2,h3,hp,c1,c2,mp;
s=1e-5;
int i=0;
h1=f(m1);
h2=f(m2);
h3=f(m3);
c1=(h3-h1)/(m3-m1);
c2=((h2-h1)/(m2-m1)-c1)/(m2-m3);
mp=(m1+m3-(c1/c2))/2;
hp=f(mp);
while (fabs((m2-mp)/m2)>=s)
{
i++;
if ((mp-m2)*w>0)
{
if (h2>=hp)
{
m1=m2;
h1=h2;
m2=mp;
h2=hp;
}
else
{
m3=mp;
h3=hp;
}
}
else
{
if (h2>=hp)
{
m3=m2;
h3=h2;
m2=mp;
h2=hp;
}
else
{
m1=mp;
h1=hp;
}
}
h1=f(m1);
h2=f(m2);
h3=f(m3);
c1=(h3-h1)/(m3-m1);
c2=((h2-h1)/(m2-m1)-c1)/(m2-m3);
mp=(m1+m3-c1/c2)/2;
hp=f(mp);
printf("%f\n",mp);
}
printf("\n");
printf("迭代次数:%d\n",i);
printf("得到的近似极小点:%f\n",mp);
printf("相应的函数值:%f\n",f(mp));
printf("**************************************************************************\n"); }
运行结果:
总结
如上所述,运用二次插值法求得了已知函数的极小值。运用VC++6.0实现编译,得到所要的结果。运算结果接近,证明程序编译正确。