logo资料库

抛物线法—二次插值法C++编程.docx

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
抛物线法—二次插值法: 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; } } } }
分享到:
收藏