一種用C語言實現的sqrt開方函式及最優化問題的思考方式
第一次寫部落格,心情有點小激動吼
今天上課的時候老師講的“最優化問題的解決思路”倒是覺得挺有意思的,和大家分享一下~
先放老婆
就是一個簡單開放函式的實現(程式碼如下圖所示),其中daita是自定義的精度範圍,在這個精度下求得
符合條件,額,也就是開方這一操作的最優解。
為什麼說是最優解,不是解呢?
其實很好理解,有些數開方是無理數,在有限儲存位數下無法求得真實解;而且,如果面向實際,我們
也只是在精度允許的範圍內求出一個“近似解”,就足以拿來運算然後去解決實際問題。
所謂的“最優”也不過是和所有“近似解”去比較,在種種限制之下(儲存,計算,精度要求等等)最接
近與“真實解”的解。
點選檢視程式碼
#include<stdio.h> #define daita 0.00001 float my_sqrt(double a){ double result = a; double lastvalue;//完成初始化 do{ lastvalue = result; result = 0.5*(result+a/result); }while(lastvalue-result>daita); return result; } int main(){ double a,result; printf("請輸入要開放的數: "); scanf("%lf",&a); result = my_sqrt(a); printf("%lf",result); return 0; }
這個函式結構一目瞭然,不多贅述
最優化問題的思考
我覺得我的老師是一個幽默而且善於思考的人,我下文的所有描述不過是拾人牙慧,但是傳播知識與有趣
的思想本身就很令人快樂。
最優化問題的求解問題,有兩個重要的點。一個是“搜尋方向”,一個就是“步長”
可以簡寫成下面的樣子
Xn+1 = Xn + lamda * daita;
s.t(約束調節)
這裡的lamda指的就是搜尋方向,而daita指的是搜尋方長;
當搜尋方向與步長都合適的時候,進過有限次的搜尋就能越來越逼近與真實值;
而當搜尋方向錯誤,那問題就比較嚴重,結果的正確性毫無保證;
而當搜尋步長出現錯誤,那麼可能會導致搜尋次數過多而無法計算出結果或者
遺漏跳過最優解。
所以,一個優秀的最優解問題解決演算法,應該是兩者的完美結合。這也是“牛頓法”的主要思路
另外,此方法還有另外一種變式
Xn+1 = Xn + (t * lamda) * daita;
s.t(約束條件)
其中,t用來控制步長,來進一步控制步長,使其在每一次的迭代過程中取值都是“合適的”。
這是“牛頓下山法”的主要思路。
最後
我下一次打算將這個演算法的數學原理髮出來,現在還不會打數學關係式。然後配合一些最優化問題例項,詳細將一些最優化問題是如何從現實對映的抽象的問題空間,然後通過最優化問題求出的最優解的整體過程詳細分享一下。