1. 程式人生 > 其它 >一種用C語言實現的sqrt開方函式及最優化問題的思考方式

一種用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用來控制步長,來進一步控制步長,使其在每一次的迭代過程中取值都是“合適的”。
這是“牛頓下山法”的主要思路。

最後

我下一次打算將這個演算法的數學原理髮出來,現在還不會打數學關係式。然後配合一些最優化問題例項,詳細將一些最優化問題是如何從現實對映的抽象的問題空間,然後通過最優化問題求出的最優解的整體過程詳細分享一下。

現在關注我,你就是長老級粉絲了呦!♥