抛物线法—二次插值法:
1.基本原理(算法)
先给定三点 x1f20。
Step1 若1−2 ≤,则转 step10;否则转 step2。
Step1 若 2−0f1+ x1−x2f0+ x0−x1f2 ≤,则转 step10;否则转 step3。;
Step3 按公式x=0.5× x2×x2−x0×x0f1+x1×x1−x2×x2f0+x0×x0−x1×x1f2
x2−x0f1+x1−x2f0+x0−x1f2
Step2 令 x2=a+0.618(b-a),f2=f(x2);
计算 x,并计算 fx=f(x),
step4。
Step4 若 f0-fx<0,则转 step6;若 f0-fx=0,则转 step7;f0-fx>0,则转 step5.
Step5 若 x0>x,则令 x2=x0,x0=x,f2=f0,f0=fx,转 step1;否则,x1=x0;x0=x;f1=f0;f0=fx,转 step1.
Step6 若 x0>x,则 x2=x,f2=fx,转 step1;否则,x1=x,f1=fx,转 step1。
Step7 若 x0x,则转 step9.
Step8 令 x3=0.5 (x1+x0)计算 f3=f(x3);
若 f3f0,则 x1=x3,f1=f3,转 step1.
Step9 令 x1=x;x2=x0;x0=0.5(x1+x2);f1=fx;f2=f0;计算 f0=f(x0),转 step1.
Step10 令 x*=x0,f*=f0.
2.下面以课本例 1.4.1“求 minf(x)=x2-x+2 在[-1,3]上的极小点”为例进行编程(C 语言):
#include
#include
#define f(x) x*x-x+2
int main()
{
double f0,f1,f2,f3,fx,x0,x1,x2,x3,e,x;
int k=0;
e=0.32;
printf("请输入 x1=");
scanf("%lf",&x1);
printf("请输入 x0=");
scanf("%lf",&x0);
printf("请输入 x2=");
scanf("%lf",&x2);
f1=f(x1);
f0=f(x0);
f2=f(x2);
while (1)
{
x=0.5*((x2*x2-x0*x0)*f1+(x1*x1-x2*x2)*f0+(x0*x0-x1*x1)*f2)/((x2-x0)*f1+(x1-x2)*f0+(x0-x1)*f2)
;
fx=f(x);
if(fabs(x1-x2)<=e)
{
printf("\n 迭代次数为%d\nf(x)的最优解为%lf\n 最优值为%f\n",k,x0,f0);
break;
}
if((x2-x0)*f1+(x1-x2)*f0+(x0-x1)*f2<=e)
{
printf("\n 迭代次数为%d\nf(x)的最优解为%lf\n 最优值为%f\n",k,x0,f0);
break;
}
if(f0-fx<0)
{
if(x0f0)
{
}
x1=x3;f1=f3;k++;continue;
}
if(x0>x)
{
x1=x;x2=x0;x0=0.5*(x1+x2);f1=fx;f2=f0;f0=f(x0);k++;continue;
}
}
if(f0-fx>0)
{
if(x0-x>0)
{
x2=x0;x0=x;f2=f0;f0=fx;k++;continue;
}
else
{
x1=x0;x0=x;f1=f0;f0=fx;k++;continue;
}
}
}
}