黄金分割法与进退法的C语言程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基本思想:对f(x)任选一个初始点a1及初始步长h,通过比较这两点函数值的大小,确定第三点位置,比较这三点的函数值大小,确定是否为“高—低—高”形态。(1)选定初始点a,初始步长h=h0,计算y1=f(a1),y2=f(a1+h)。(2)比较y1和y2。(a)如y1y2,向右前进;加大步长h=2h,转(3)向前;(b)如y1y2,向左后退;h=-h0,将a1与a2,y1与y2的值互换。转(3)向后探测;(c)如y1=y2,极小点在a1和a1+h之间。(3)产生新的探测点a3=a1+h,y3=f(a3);(4)比较函数值y2与y3:(b)如y2y3,加大步长h=2h,a1=a2,a2=a3,转(3)继续探测。(a)如y2y3,则初始区间得到:a=min[a1,a3],b=max[a3,a1],函数最小值所在的区间为[a,b]。我编的修改#includemath.h#includestdio.h#definef(x)3*x*x*x-4*x+2main(){doublef1,f2,f3,temp,x1,x2,x3,h,a,b,Y1,Y2,A,A1,A2,e=0.2;intn;printf(x1=);scanf(%lf,&x1);printf(h=);scanf(%lf,&h);f1=f(x1);x2=x1+h;f2=f(x2);if(f1==f2)a=x1(x1+h)?x1:x1+h;b=x1(x1+h)?x1:x1+h;if(f2f1){h=-h;temp=x1;x1=x2;x2=temp;temp=f1;f1=f2;f2=temp;x3=x2+h;f3=f(x3);}elseif(f2f1){h=2*h;x3=x2+h;f3=f(x3);}while(f2f3){x1=x2;x2=x3;f2=f(x3);x3=x2+h;f3=f(x3);}a=x1x3?x1:x3;b=x1x3?x1:x3;printf([%f,%f]\n,a,b);A1=b+0.328*(b-a);Y1=f(A1);A2=a+0.618*(b-a);Y2=f(A2);do{n++;if(!(Y1Y2)){a=A1;A1=A2;Y1=Y2;A2=a+0.618*(b-a);Y2=f(A2);}else{b=A2;A2=A1;Y2=Y1;A1=b+0.382*(b-a);Y1=f(A1);}}while((a-b)=e||(a-b)=-e);A=(a+b)*0.5;printf(A=%lf\n,A);printf(f(A)=%lf\n,f(A));printf(n=%d\n,n);printf(a=%f,b=%f,a,b);getch();}陈文斌#includestdio.hdoublem,n,p,e,a,b;doubleF(doublex){returnm*x*x+n*x+p;}InputData()//数据输入函数的名称要和倒数第四行的一起改,要同时改成同一名称{printf(x,y,z=?);//这里提示输入方程的系数,提示语句x,y,z=?改成你自己的scanf(%lf,%lf,%lf,&m,&n,&p);printf(e=?);//这里提示输入黄金分割的精度,提示语句e=?改成你自己的scanf(%lf,&e);}JTF()//进退法的名称要和倒数第三行一起改{doublex1,x2,x3,f1,f2,f3,t,h;printf(x0,h=?);//这里提示输入进退法的初始点和步长,提示语句x0,h=?改成你自己的scanf(%lf,%lf,&x1,&h);f1=F(x1);x2=x1+h;f2=F(x2);if(f1f2){h=-h;t=x1;x1=x2;x2=t;t=f1;f1=f2;f2=t;}else{h=2*h;}x3=x2+h;f3=F(x3);while(!(f2f3)){x1=x2;x2=x3;f2=f3;x3=x2+h;f3=F(x3);}if(x1x3){a=x3;b=x1;}else{a=x1;b=x3;}printf([%lf,%lf]\n,a,b);}HJFGF()//黄金分割法的名称要和倒数第二行一起改{doublex1,x2,f1,f2;x1=a+0.382*(b-a);x2=a+0.618*(b-a);do{if(F(x1)F(x2)){b=x2;x2=x1;f2=f1;x1=a+0.382*(b-a);f1=F(x1);}else{a=x1;x1=x2;f1=f2;x2=a+0.618*(b-a);f2=F(x2);}}while(!((a-b0?a-b:b-a)e));printf(a=%lf,b=%lf\n,a,b);printf(x=%lf\n,0.5*(a+b));printf(F(x)=%lf\n,F(0.5*(a+b)));}main(){InputData();//数据输入JTF();//进退法HJFGF();//黄金分割法}

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功