資源描述:
《一為搜索法程序說(shuō)明》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、一維搜索方法求極小點(diǎn)的程序說(shuō)明一、程序編寫的基本思想打開VC++6.0,文件——新建——文件一一C卄SourceFile——輸入文件名——?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的程序。在所建立的程序下編寫所需要的程序,用switch分別將牛頓法、黃金分割法、二次插值法(拋物線法)編寫程序計(jì)算函數(shù)函數(shù)f(x)=sinx的極小點(diǎn)x*,迭代次數(shù),以及每次迭代時(shí)近似極小點(diǎn)。各種一維搜索方法的具體過(guò)程(1)用switch語(yǔ)句選擇搜索方法while(l){switch(getchar()){case'A':{牛頓法};break;case'B':{黃金
2、分割法};break;case'C':{二次插值法};break;casevDf:jieshu=l;break;}(2)各種方法流程圖A、牛頓法:①牛頓法流程圖:結(jié)束B、黃金分割法①黃金分割法程序框圖:結(jié)束C.二次插值法:①二次差值法流程圖:①根據(jù)流程圖編寫程序://shejixpp:Definestheentrypointfortheconsoleapplication.//includeMstdafx.hH#include#include#definef(x)sin(x)//宏
3、定義函數(shù)g(x)=sinxvoidmain()floatr,e=0?00001,min;〃定義初始變量while(l){printf(n選擇方法:A牛頓法,B黃金分割法,C二次插值法D,結(jié)束「);intjieshu=0;switch(getchar())floatdl,d2,d,fl,f2,h;intp=l;printfC*輸入初始值j;scanf(M%r&dl);//^j入初始區(qū)間fl二cos(dl);/////////////////////////////////////改公式,求公式的導(dǎo)數(shù)f2=-s
4、in(dl);d2=dl-(fl/f2);while(fabs(dl-d2)>=e){P++;dl=d2;fl=cos(dl);f2=-sin(dl);d2=dl-(fl/f2);r=d2;printf(n%hn,r);//////^出極小點(diǎn)}r=d2;min=f(r);printfC迭代次數(shù)=%dH,p);///輸出迭代次數(shù)printf("函數(shù)的極小點(diǎn)二%fH?r);////僦出極小點(diǎn)printf(n極小值min=%f”,min);////////〃瀚出極小值};break;//continue;ca
5、se'B*:{floatal,a2,yl,y2,k;floata,b;inti=l;printfL輸入初始搜索區(qū)間[a,b]H);scanf(M%f%&b);/隔入初始區(qū)間e=0.00001;al=b-0.618*(b-a);a2=a+0.618*(b-a);yl=f(al);y2=f(a2);while((fabs((b-a)/b)>e&&fabs((y2-yl)/y2)>e))i=i+l;if(yl>=y2)a=al;al=a2;yi=y2;a2=a+0.618*(b-a);y2=sin(a2);}else
6、{b=a2;a2=al;y2=yi;al=b-0.618*(b-a);yl=sin(al);}r=a;printf(H%foi,r);/////瀚出極小點(diǎn)a=(a+b)/2;r=a;min=f(r);printf(n^代次數(shù)=%d”,i);〃觸出迭代次數(shù)printf(n函數(shù)的極小點(diǎn)二%fn,r);//////^g出極小點(diǎn)printf(n極小值min=%fM?min);////////////^出極小值};break;//continue;case'C*:floatml,m2,m3;//////////
7、////////////////////////////////////取值范圍floatw=1;floathl,h2,h3,h,cl,c2,m;intn=0;print"輸入初始搜索區(qū)間[ml,m3]iT);scanf(n%f%fn,&ml,&m3);/隔入初始區(qū)間m2=(ml+m3)/2;don++;hl=f(ml);h2=f(m2);h3=f(m3);cl=(h3-hl)/(m3-ml);c2=((h2-hl)/(m2-ml)-cl)/(m2-m3);m=(ml+m3?cl/c2)/2;h=f(m);if(
8、(m?m2)*v>0){if(h2>=h){ml=m2;hl=h2;m2=m;h2=h;}else{m3=m;h3=h;}elseif(h2>=h)m3=m2;h3=h2;m2=m;h2=h;}else{ml=m;hl=h;printf(H%AnH,r);///////輸出極小點(diǎn)}while(fabs(m3-ml)>=e);r=m;min=f(r);pri