黃金分割法的參數(shù)優(yōu)化設(shè)計_第1頁
黃金分割法的參數(shù)優(yōu)化設(shè)計_第2頁
黃金分割法的參數(shù)優(yōu)化設(shè)計_第3頁
黃金分割法的參數(shù)優(yōu)化設(shè)計_第4頁
黃金分割法的參數(shù)優(yōu)化設(shè)計_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

目 錄 1 緒論 . 1 1.1 研究誤差的意義 . 1 1.2 研究誤差的目的 . 1 1.3 主要的研究范圍 . 1 2 誤差的基本概念 . 1 2.1 誤差的定義及表示方法 . 1 2.1.1 誤差的定義 . 2 2.1.2 誤差的表示 . 2 2.2 誤差的來源及分類 . 2 2.2.1 誤差的來源 . 2 2.2.2 誤差的分類 . 3 2.3 精度的基本概念 . 3 2.4 有效數(shù)字及數(shù)據(jù)運算 . 4 2.4.1 有效數(shù)字的概念 . 4 2.4.2 有效數(shù)字舍入規(guī)則 . 4 2.4.3 數(shù)據(jù)運算規(guī)則 . 4 3 黃金分割法的基本思想 . 5 4 誤差的分析 . 6 4.1 算法對精度的影響 . 6 4.2 e 對精度的影響 . 10 4.3 區(qū)間變化產(chǎn)生的原因 . 12 4.4 N( 0.618) 對精度的影響 . 14 5 小結(jié) . 24 致謝 . 25 參考文獻(xiàn) . 26 1 1 緒論 1.1 研究 誤差的意義 人類為了認(rèn)識自然與改造自然,需要不斷地對 自然界的各種現(xiàn)象進(jìn)行測量和研究。由于實驗方法和實驗設(shè)備的不完善,周圍環(huán)境的影響,以及受人們認(rèn)識能力所限等,測量和實驗所得數(shù)據(jù)和被測量的真值之間,不可避免地存在著差異,這在數(shù)值上即表現(xiàn)為誤差。隨著科學(xué)技術(shù)的日益發(fā)展和人們認(rèn)識水平的不斷提高,雖可將誤差控制得愈來愈小,但終究不能完全消除它。誤差存在的必然性和普遍性,已為大量實踐所證明。為了充分認(rèn)識并進(jìn)而減小或消除誤差,必須對測量過程和科學(xué)實驗中始終存在著的誤差。 研究誤差的意義: ( 1) 正確認(rèn)識誤差的性質(zhì),分析誤差產(chǎn)生的原因,以消除或減小誤差。 ( 2) 正確處理測 量和實驗數(shù)據(jù),合理計算所得結(jié)果,以便在一定條件下得到更接近真實的數(shù)據(jù)。 ( 3) 正確組織實驗過程 ,合理設(shè)計儀器或選用儀器和測量方法,以便在最經(jīng)濟(jì)條件下,得到理想的結(jié)果。 1.2 研究誤差的目的 在周圍的一切事物 的測量以及計算中,都會存在誤差。誤差的存在不僅會使計算結(jié)果出現(xiàn)很大的 誤差,還有可能導(dǎo)致結(jié)果的偏差甚至不正確。因此研究誤差的目的如下: ( 1) 認(rèn)清影響誤差的各種因素,正確分析誤差對計算結(jié)果的影響。 ( 2) 分析誤差的來源。 ( 3) 提高誤差的精度,使結(jié)果盡量接近真實值 。 1.3 主要的研究范圍 本論 文主要研究的是黃金分割法在用計算機(jī)計算時所存在的誤差。主要解決的是: ( 1) 影響 黃金分割法 計算結(jié)果精度的因素; ( 2) 黃金分割法 誤差的產(chǎn)生原因; ( 3) 提高黃金分割法計算精度的 主要解決方法。 黃金分割法應(yīng)用廣泛,對其誤差的研究具有重要的意義。提高其計算結(jié)果的精度,能在以后的工業(yè)生產(chǎn)發(fā)揮重要的作用。 2 誤差的基本 概念 2.1 誤差的定義及表示方法 2 2.1.1 誤差的定義 所謂誤差就是測得值與被側(cè)值的真值之間的差,可用下式表示: 誤差 =測得值 -真值 ( 2-1) 測量誤差可用絕對誤差表示,也可用相對誤差表示。 2.1.2 誤差的表示 ( 1) 絕對誤差 某量值的測得值與真值之差為絕對誤差,通常簡稱為誤差,即 絕對誤差 =測得值 -真值 ( 2-2) 由式( 2-2)可知,絕對誤差可能是正值或負(fù)值。 所謂真值就是值在觀測一個量時,該量本身所具有的真實大小。量的真值是一個理想的概念,一般是不知道的。但在,某些特定情況下又是可知的。為了實際的需要,在實際測量中,常用被測量的實際值來代替真值,而實際值的定義是滿足規(guī)定 精確度的用來代替真值使用的量值。 在實際工作中,經(jīng)常使用修正值。為消除系統(tǒng)誤差用代數(shù)法而加到測量結(jié)果上的值稱為修正值。將測得值加上修正值后可得近似的真值,即 真值 =測得值 +修正值 ( 2-3) 由此得 修正值 =真值 -測得值 ( 2-4) 修正值與誤差的大小相等而符號相反,測得值加修正值后可以消除該誤差的影響。但必須注意一般情況下難以得到真值,因為修正值本身也有誤差,修正后只能得到較測得值更為準(zhǔn)確的結(jié)果。 ( 2) 相對誤差 絕對誤差與被測值的真值之比稱為相對誤差。因測得值與真值接近,故也可以近似用絕對誤差與測得值之比作為相對誤差,即 相對誤差 =絕對誤差 /真值 =絕對誤差 /測得值 ( 2-5) 由于絕對誤差可能為正值或負(fù)值,因此相對誤差也可能為正值或負(fù)值。 ( 3) 引用誤差 所謂引用誤差指的是一種簡化和實用方便的儀器儀表表示值的相對誤差,它是以儀器儀表某一刻度點的示值誤差為分子,一測量范圍上限值或全量程為分母,所得的比值稱為引用誤差。即 引用誤差 =示值誤差 /測量范圍上限 ( 2-6) 2.2 誤差的來源 及分類 2.2.1 誤差的來源 3 在測量過程中,誤差產(chǎn)生的原因可歸納為以下幾個方面: ( 1) 測量裝置誤差 測量裝置誤差又可以分為以下幾類: 1) 標(biāo)準(zhǔn)量具誤差 ; 2) 儀器誤差 ; 3) 附件誤差 。 ( 2) 環(huán)境誤差 ; ( 3) 方法誤差 ; ( 4) 人員誤差 。 2.2.2 誤差的分類 按照誤差的特點與性質(zhì),誤差可分為系統(tǒng)誤差、隨機(jī)誤差(也稱偶然誤差)和粗大誤差三類。 ( 1) 系統(tǒng)誤差 在同一條件下,多次測量同一量值時,絕對值和符號保持不變,或在條件改變時,按一定 規(guī)律變化的而誤差稱為系統(tǒng)誤差。 ( 2) 隨即誤差 在同一測量條件下,多次測量同一量值時,絕對值和符號以不可預(yù)定的方式便哈誤差稱為隨即誤差。 ( 3) 粗大誤差 超出在規(guī)定條件下預(yù)期的誤差稱為粗大誤差,或稱為 “寄生誤差 ”。此誤差值較大,明顯歪曲測量結(jié)果,如測量時對錯了標(biāo)志,讀錯或記錯了數(shù)、使用有缺陷的儀器以及在測量時因操作不細(xì)心而引起的過失性誤差等。 上面三種在一定條件下可以相互轉(zhuǎn)化,必須注意??傊到y(tǒng)誤差和隨機(jī)誤差之間并不存在絕對的界限。隨著誤差性質(zhì)認(rèn)識的深化和測量技術(shù)的發(fā)展,有可能把過去作為隨機(jī)誤差的某些誤差 分離出來作為系統(tǒng)誤差處理,或把某些系統(tǒng)誤差當(dāng)作隨機(jī)誤差來處理。 2.3 精度 的基本概念 反映測量結(jié)果與真值接近程度的量,稱為精度,它與誤差的大小相對應(yīng),因此可用誤差的大小來表示精度的高低,誤差小則精度高,誤差大則精度低。 精度可分為 ( 1) 準(zhǔn)確度 它反映測量結(jié)果中系統(tǒng)誤差的影響程度。 ( 2) 精密度 它反映測量結(jié)果中隨機(jī)誤差的影響程度。 4 ( 3) 精確度 它反映測量結(jié)果中系統(tǒng)誤差和隨機(jī)誤差綜合的影響程度,其定量的、特性可用測量的不確定度(或極限誤差)來表示。 2.4 有效數(shù)字及數(shù)據(jù)運算 在測量結(jié)果和數(shù)據(jù)運算中 ,確定用幾位數(shù)字來表示測量或數(shù)據(jù)運算的結(jié)果,是一個十分重要的問題。測量結(jié)果既然包含有誤差,說明它是一個近似數(shù),其精度有一定限度,在測量結(jié)果的數(shù)據(jù)位數(shù)或進(jìn)行數(shù)據(jù)運算時的取值多少時,皆應(yīng)以測量所能達(dá)到的精度為依據(jù)。如果認(rèn)為不論測量結(jié)果的精度如何,在一個數(shù)值中小數(shù)點后面的位數(shù)愈多,這個數(shù)值就愈精確;或者在數(shù)據(jù)運算中,保留的位數(shù)愈多,精度就愈高,這種認(rèn)識都是片面。一方面是因為小數(shù)點位置決定不了精度,它僅與采取的單位有關(guān),而小數(shù)點位置則不同。另一方面,測量結(jié)果的精度與測量方法及儀器有關(guān),在記錄或數(shù)據(jù)運算時所取的數(shù)據(jù)位 數(shù),其精度不能超過測量所能達(dá)到的精度;反之,若低于測量精度,也是不正確的,因為它將損失精度。 2.4.1 有效數(shù)字 的概念 含有誤差的任何近似數(shù),如果其絕對誤差界是最末位數(shù)的半個單位,那么從這個近似數(shù)左方起的第一個非零的數(shù)字,稱為第一位有效數(shù)字。從第一位有效數(shù)字起到最末一位數(shù)字止的所有有效數(shù)字。 2.4.2 有效 數(shù)字舍入規(guī)則 對于位數(shù)很多的近似數(shù),當(dāng)有效位數(shù)確定后,其后面多余的位數(shù)應(yīng)予舍去,而保留的有效字最末一位數(shù)字應(yīng)按下面的舍入規(guī)則進(jìn)行湊整。 ( 1) 若舍去部分的數(shù)值,大于保留部分的末位的半個單位,則末位加 1; ( 2) 若舍去部分的數(shù)值,小于保留部分的位數(shù)的半個單位,則末位不變; ( 3) 若舍去部分的數(shù)值,等于保留部分的末位的半個單位,則末位湊成偶數(shù),即當(dāng)末位為偶數(shù)時則末位不變,當(dāng)末位為奇數(shù)則末位加 1。 2.4.3 數(shù)據(jù)運算規(guī)則 在近似數(shù)運算中,為了保證最后結(jié)果有盡可能高的精度,所有參與運算的數(shù)據(jù),在有效數(shù)字后可多保留一位數(shù)字作為參考數(shù)字,或稱為安全數(shù)字。 ( 1) 在近似數(shù)加減運算時,各運算數(shù)據(jù)以小數(shù)位數(shù)為準(zhǔn),其余各數(shù)據(jù)可多取一位小數(shù),但最后結(jié)果應(yīng)與小數(shù)位數(shù)最少的數(shù)據(jù)小數(shù)位數(shù)的相同。 ( 2) 在近似數(shù)乘除運算時,各運算 數(shù)據(jù)以有效位數(shù)最少的數(shù)據(jù)位數(shù)為準(zhǔn),其余各數(shù)據(jù)要比有效位數(shù)最少的數(shù)據(jù)位數(shù)多取一位數(shù)字,而最后結(jié)果應(yīng)與有效位數(shù)最少的數(shù)據(jù)位數(shù)相同。 5 ( 3) 在近似數(shù)平方或平方運算時,平方相當(dāng)于乘法運算,平方是平方的逆運算,故可按乘除運算處理。 ( 4) 在對數(shù)運算時, 為有效數(shù)字的數(shù)據(jù)應(yīng)該用 位對數(shù)表,或用 為對數(shù)表,以免損失精度。 ( 5) 三角函數(shù)運算中,所取函數(shù)值的位數(shù)應(yīng)隨角度誤差的減小而增多。 3 黃金分割法的基本思想 在實際工程優(yōu)化設(shè)計中,目前應(yīng)用最多的一維搜索方法是黃金分割法,又稱作 0.618 法。黃金分割法屬于區(qū)間消去法的范 圍。這里,首先介紹黃金分割法的消去思想和迭代格式; 我們知道 F(x)的最優(yōu)解在 a,b上為凸函數(shù)且連續(xù),當(dāng)然,由后面對方法的分析我們可以看到,有時上述要求過于嚴(yán)格了,這表明這種方法的適應(yīng)面是相當(dāng)廣泛的。 黃金分割法的基本方法是:由于函數(shù)最小值所在的區(qū)間滿足高 -低 -高的原則,邊界是函數(shù)值的兩個高點,這樣在搜索區(qū)間 a,b內(nèi),只要有兩個點即可確定那一部分的區(qū)間內(nèi)不含有函數(shù)的最小值。我們在首輪迭代時,在搜索區(qū)間 a,b內(nèi)適當(dāng)插入兩點 x1,x2 并計算其函數(shù)值,在以后的迭代時,每輪只計算一個新點,保留上輪計算的 一個點,進(jìn)行迭代消去一部分區(qū)間即可。 為此在首輪時要求插入點 x1,x2 的位置相對于區(qū)間 a,b兩端點具有對稱性,即: )( a-bbx 1 )( abax 2 (4-1) 式中, 為待定常數(shù)。同時,在下輪迭代時,保留上面的一個點,只計算一個新點即可完成迭代 . 為了求出 ,我們進(jìn)一步分析迭代過程,從圖可以看出,除要求點對稱外,黃金分 割法還要求下來的區(qū)間內(nèi)再插入一點所形成的新三段與原來區(qū)間的三段具有相同的比例分布。設(shè)原區(qū)間 a,b的長度為 1,在第一輪搜索時,設(shè)有F(x1)F(x2)的情況 ),則保留下來的區(qū)間為 a,x2,其長度為,區(qū)間縮短率為 1-。在下一輪的迭代中,上一輪保留下的點 x1 成為新點 x2,重新計算點 x1,為了保持相同的比例分布,新插入點 x1應(yīng)在 (1-)位置上, x在原區(qū)間的 1- 位置,故有 ( 4-2) 即 012 ( 4-3) 取方程的正根,有 ( 4-4) 116 1 8.02125 6 若保留下來的區(qū)間為 ,根據(jù)插入點的對稱性,也能推出同樣的 值。在工程中,0.618 是一個經(jīng)常被使用的數(shù),所以,這種尋優(yōu) 方法, 叫做 “黃金分割法 ”,是指將一線段分成兩段的方法,使整段長與較長段與較短段長度的比值,即 )1(:1 使用黃金分割法,相鄰兩次搜索的區(qū)間縮短率為 0.618,所以,黃金分割法又被稱作 0.618 法。 黃金分割法的迭代過程和程序框圖 如下 : 按照上述分析,黃金分割法的搜索過程是: ( 1) 給出初始搜索區(qū)間 a,b 及收斂精度 ,將 賦值 0.618。 ( 2) 按坐標(biāo)點計算公式( 4-1)計算 x1 和 x2 ,并計算其對應(yīng)的函數(shù)指 F(x1)和 F( x2) 。 ( 3) 比 較 F( x1) 和 F( x2) 的大小,縮小搜索區(qū)間,進(jìn)行區(qū)間名稱的代換。 ( 4) 檢查區(qū)間是否縮短到足夠小或函數(shù)值收斂到足夠接近,如果條件滿足,則到步驟 ( 5) ,否則,到步驟 ( 6)。 ( 5) 在保留區(qū)間中計算一個新的試驗點及其相應(yīng)的函數(shù)值,轉(zhuǎn)到步驟 ( 3) . ( 6) 取最后兩試驗點的平均值作為極小值的數(shù)值近似值,并計算該點的函數(shù)值作為目標(biāo)函數(shù)的最優(yōu)解。黃金分割法的程序框圖如圖 4-1 所示。 4 誤差的分析 4.1 算法對精度的影響 在黃金分割法 c 語言的程序中,有多種算法,下面我們只介紹兩種算法。并且通過這兩種算法,比較其對 結(jié)算結(jié)果的影響。 ( 1) 第一種算法 #define N 0.618 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); 7 圖 4-1 x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+(b-a)*(1-N); printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+(b-a)*N; printf(The qujian is %f,%f.n,a,b); 輸入 a,b,c X1=a+0.382(b-a)F(x2) X2=a+0.618(b-a)F(x2) F(x1)F(x2) b=x2 x2=x1,F2=F1 x1=a+0.382(b-a),F1=F(x1) a=x1 x1=x2,F1=F2 x2=a+0.618(b-a),F2=F(x2) |a-b| ? X*=0.5(a+b) F*=F(x*) 結(jié) 束 N Y N Y 8 c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 結(jié)果 : 區(qū)間 1, 4 精度 0.01 N=0.618 第一次 x1 2.145880 第一次 x2 2.854120 區(qū)間 2.145880, 4.00000 答案 3.072940 區(qū)間 2.145880, 3.291760 答案 2.718820 區(qū)間 2.583520, 3.291760 答案 2.937640 最后答案 2.937640 ( 2) 第二 種算法 #define N 0.618 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; 9 printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 結(jié)果: 區(qū)間 1, 4 精度 0.01 N=0.618 第一次 x1 2.145880 第一次 x2 2.854120 區(qū)間 2.146000, 4.000000 答案 3.073000 區(qū)間 2.146000,3.292000 答案 2.719000 區(qū)間 2.584000,3.292000 答案 2.938000 10 最后答案 2.938000 ( 3) 總結(jié) 從這兩種算法可以看出來,第一種算法得到的 x 數(shù)值精度較低,第二種得到的數(shù)值精度較高。這是因為第二種算法中應(yīng)用了公式關(guān)系是: x1=a+b-x2;x2=a+b-x2。而第一種算法應(yīng)用了公式: x1=a+(b-a)*(1-N); x2=a+(b-a)*N。相比較而言,第二種關(guān)系式用 的是加法關(guān)系,而第一種算法用的是乘法關(guān)系,相乘的關(guān)系降低了數(shù)值的精度。因此,在計算中應(yīng)盡量使用加法關(guān)系,少用或不用乘法及其它的關(guān)系。 4.2 e 對精度的影響 本節(jié)主要介紹精度 e 對計算結(jié)果的影響 ,其主程序為第 4.3 節(jié)的第二種算法。在這次的研究中需要改變輸入精度 e 的值。在本節(jié)中我們總共進(jìn)行了 7 輪。如下所訴。 ( 1) 第一輪 區(qū)間 1, 4 精度 0.1 N=0.618 第一次 x1 2.146000 第一次 x2 2.85400 區(qū)間 2.146000, 4.000000 答案 3.073000 區(qū)間 2.146000,3.292000 答案 2.719000 區(qū)間 2.584000, 3.292000 答案 2.938000 最后答案 2.938000 ( 2) 第二輪 區(qū)間 1, 4 精度 1 N=0.618 第一次 x1 0.865200 第一次 x2 0.534800 區(qū)間 1.400000, 0.534800 答案 0.967400 最后答案 0.967400 ( 3) 第三輪 區(qū)間 1, 4 精度 0.01 N=0.618 11 第一次 x1 2.146000 第一次 x2 2.85400 區(qū)間 2.146000, 4.000000 答案 3.073000 區(qū)間 2.146000,3.292000 答案 2.719000 區(qū)間 2.584000, 3.292000 答案 2.938000 最后答案 2.938000 ( 4) 第四輪 區(qū)間 1, 4 精度 0.001 N=0.618 第一次 x1 2.146000 第一次 x2 2.854000 區(qū)間 2.146000, 4.000000 答案 3.073000 區(qū)間 2.146000,3.292000 答案 2.719000 區(qū)間 2.584000, 3.292000 答案 2.938000 最后答案 2.938000 ( 5) 第五輪 區(qū)間 1, 4 精度 0.0001 N=0.618 第一次 x1 2.146000 第一次 x2 2.854000 區(qū)間 2.146000, 4.000000 答案 3.073000 區(qū)間 2.146000,3.292000 答案 2.719000 區(qū)間 2.584000, 3.292000 答案 2.938000 最后答案 2.938000 ( 6) 第六輪 區(qū)間 1, 4 精度 0.00001 N=0.618 第一次 x1 2.146000 第一次 x2 2.854000 區(qū)間 2.146000, 4.000000 答案 3.073000 區(qū)間 2.146000,3.292000 答案 2.719000 區(qū)間 2.584000, 3.292000 答案 2.938000 12 最后答案 2.938000 ( 7) 第 七輪 區(qū)間 1, 4 精度 0.000001 N=0.618 第一次 x1 2.146000 第一次 x2 2.854000 區(qū)間 2.146000, 4.000000 答案 3.073000 區(qū)間 2.146000,3.292000 答案 2.719000 區(qū)間 2.584000, 3.292000 答案 2.938000 最后答案 2.938000 ( 8) 總結(jié)( e 對 x 精度的影響列表如下:) 次數(shù) 第一次 第二次 第三次 第四次 第五次 第六次 第七次 e 0.1 1 0.01 0.001 0.0001 0.00001 0.000001 x 2.938000 0.967400 2.938000 2.938000 2.938000 2.938000 2.938000 e 的精度對計算結(jié)果有很大的影響。當(dāng) e=1 時, x=0.967400 結(jié)果與精確值 x=3有很大的出入,相差很大。但隨著 e 的精度的提高, e 的精度得到 0.1 或更高的時候, x 的值的精度不會再提高了。因此對于 e 來說,不是精度越高越好,太高的精度會增加計算量,但對結(jié)果精度的提高沒有影響或影響甚微。所以,計算時應(yīng)根據(jù)實際情況去選擇,而并非一味的去提高精度。 4.3 區(qū)間變 化產(chǎn)生的原因 黃金分割法的計算過程也會對結(jié)算的結(jié)果造成一定程度的影響。在本節(jié)中我們主要研究計算時,計算過程中區(qū)間的變化及產(chǎn)生這種現(xiàn)象的原因。如程序如下: #define N 0.61 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); 13 x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 結(jié)果: 區(qū)間 1, 4 精度 0.01 N=0.618 第一次 x1 2.145880 第一次 x2 2.854120 14 區(qū)間 2.146000, 4.000000 答案 3.073000 區(qū)間 2.146000,3.292000 答案 2.719000 區(qū)間 2.584000,3.292000 答案 2.938000 最后答案 2.938000 總結(jié) 從以上結(jié)果可以看出區(qū)間并不是逐漸的減小,而是先減小,而后又增大了。這是因為在算法中當(dāng) x1 賦值給上一輪計算的 x2 時, x1 的數(shù)值可能要比 x2 大的多;或著 x2 賦值給上一輪計算的 x1 時, x2 的數(shù)值可能要比 x1 大的多。 4.4 N( 0.618) 對精度的影響 在程序的計算中 N 的有效位數(shù)也會對計算的結(jié)果產(chǎn)生影響。本節(jié)主要介紹 N的值對計算結(jié)果的影響。以下是 N 取不同值時的主程序及計算結(jié)果。 ( 1) 第一輪 #define N 0.62 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+(b-a)*(1-N); printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); 15 elsea=x1; x1=x2; x2=a+(b-a)*N; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 結(jié)果: 區(qū)間 1, 4 精度 0.01 N=0.62 第一次 x1 2.140000 第一次 x2 2.860000 最后答案 2.500000 ( 2) 第二輪 #define N 0.618 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); 16 x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 結(jié)果 : 區(qū)間 1, 4 精度 0.01 N=0.618 第一次 x1 2.145880 第一次 x2 2.854120 區(qū)間 2.146000, 4.000000 答案 3.073000 區(qū)間 2.146000,3.292000 答案 2.719000 17 區(qū)間 2.584000,3.292000 答案 2.938000 最后答案 2.938000 ( 3) 第三輪 #define N 0.61804 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); 18 float f(float x) float t; t=x*x-6*x+2; return(t); 結(jié)果: 區(qū)間 1, 4 精度 0.01 N=0.61804 第一次 x1 2.145880 第一次 x2 2.854120 區(qū)間 2.145880, 4.00000 答案 3.072940 區(qū)間 2.145880, 3.291760 答案 2.718820 區(qū)間 2.583520, 3.291760 答案 2.937640 最后答案 2.937640 ( 4) 第四輪 #define N 0.6180 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; 19 x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 結(jié)果: 區(qū)間 1, 4 精度 0.01 N=0.6180 第一次 x1 2.146000 第一次 x2 2.854000 區(qū)間 2.146000, 4.000000 答案 3.073000 區(qū)間 2.146000,3.292000 答案 2.719000 區(qū)間 2.584000,3.292000 答案 2.938000 最后答案 2.938000 ( 5) 第五輪 #define N 0.618034 #include void main() 20 float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 21 結(jié)果: 區(qū)間 1, 4 精度 0.01 N=0.618034 第一次 x1 2.145898 第一次 x2 2.854102 區(qū)間 2.145898, 4.000000 答案 3.072949 區(qū)間 2.145898, 3.291796 答案 2.718847 區(qū)間 2.583592, 3.291796 答案 2.937694 最后答案 2.937694 ( 6) 第六輪 #define N 0.61803399 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N); printf(x1=%f.,x1); x2=a+(b-a)*N; printf(x2=%f.n,x2); while(fabs(f(x1)-f(x2)=e) if(f(x1)f(x2) b=x2; x2=x1; x1=a+b-x2; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); elsea=x1; x1=x2; 22 x2=a+b-x1; printf(The qujian is %f,%f.n,a,b); c=(x1+x2)/2; printf(The answer is %f.n,c); c=(x1+x2)/2; printf(The best answer is %f.n,c); float f(float x) float t; t=x*x-6*x+2; return(t); 結(jié)果: 區(qū)間 1, 4 精度 0.01 N=0.61803399 第一次 x1 2.145898 第一次 x2 2.854102 區(qū)間 2.145898, 4.000000 答案 3.072949 區(qū)間 2.145898, 3.291796 答案 2.718847 區(qū)間 2.583592, 3.291796 答案 2.937694 最后答案 2.937694 ( 7) 第七輪 #define N 0.61803399 #include void main() float a,b,x1,x2,c,e; float f(float x); printf(Please input a,b:); scanf(%f,%f,&a,&b); printf(Please input e:); scanf(%f,&e); x1=a+(b-a)*(1-N);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論