一維搜索法程序的編制、調試和結果分析(0.618法) 題目:f(a)=2a2+5a / g) J# k7 Y4 Y; @8 `" x: j& |
-2≦a≦4 1.實驗目的 1、加深對機械優化設計方法的基本理論和算法步驟的理解。 2、培養學生獨立編制、調試計算機程序的能力。 3、掌握常用優化方法程序的使用方法。 4、培養學生靈活運用優化設計方法解決工程實際問題的能力。 2.基本原理簡述 黃金分割法是通過不斷縮短搜索區間的長度來尋求一維函數的極小點,這種方法的基本原理是:在搜索區間[a,b]內按如下規則對稱地取兩點 和 =a+0.382(b-a);! E& a+ ?5 p+ x$ c. ?! A
=a+0.618(b-a); 黃金分割法的搜索過程是: 1)給出初始搜索區間 [a,b]
! A( _5 p$ S2 O% ?* B# ?) O+ J及收斂精度 ε,將λ賦以0.618 2)計算
1 A/ e% f/ K5 @9 [; K: K% t和 ,并計算起對應的函數值 f( ),f( ) 3)根據期間消去法原理縮短搜索區間,為了能用原來的坐標點計算公式,需進行區間名稱的代換,并在保留區間中計算一個新的試驗點及其函數值。 4)檢查區間是否縮短到足夠小和函數值收斂到足夠近,如果條件不滿足則返回到步驟2。 5)如果條件滿足,則取最后兩試驗點的平均值作為極小點的數值近似解。 黃金分割法的程序框圖如下: 3.自編優化方法程序 #include "math.h" #include "stdio.h" #define f(x) 2*x*x+5*x2 G4 }8 r0 D9 ]0 `3 D. @
/*一元函數f(x)=2x2+5x */double hj(double *a,double *b,double e,int *n) { double x1,x2,s; if(fabs(*b-*a)<=e) s=f((*b+*a)/2); else {
4 {" w9 |% `1 O S( x" ]! Jx1=*a+0.382*(*b-*a); x2=*a+0.618*(*b-*a); if(f(x1)>f(x2)) *a=x1; else *b=x2; *n=*n+1; s=hj(a,b,e,n); } return s; } main() { double s,a,b,e; int n=0; scanf("%lf %lf %lf",&a,&b,&e); W3 l( t% T0 ]; f( G2 m( K* G
/* 輸入區間[a,b]和精度e的值*/s=hj(&a,&b,e,&n);' _8 R. o& M% G9 D, N% F% @9 [
/*調用hj函數,其中n代表迭代次數*/printf("a=%lf,b=%lf,s=%lf,n=%d\n",a,b,s,n); } 4.考核計算結果及其分析。 輸入:-3 8 0.35 結果輸出:a=-1.395324 b=-1.161278 s=-3.123398 n=8。 |