当前位置:文档之家› 优化设计VC6.0二次插值法

优化设计VC6.0二次插值法

题目:利用二次插值法求()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实现编译,得到所要的结果。

运算结果接近,证明程序编译正确。

相关主题