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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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实现编译,得到所要的结果。运算结果接近,证明程序编译正确。

相关文档
最新文档