加载中...

一种用C语言实现的sqrt开方函数及最优化问题的思考方式

第一次写博客,心情有点小激动吼

今天上课的时候老师讲的“最优化问题的解决思路”倒是觉得挺有意思的,和大家分享一下~
先放老婆

image

就是一个简单开放函数的实现(代码如下图所示),其中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用来控制步长,来进一步控制步长,使其在每一次的迭代过程中取值都是“合适的”。
这是“牛顿下山法”的主要思路。

最后

我下一次打算将这个算法的数学原理发出来,现在还不会打数学关系式。然后配合一些最优化问题实例,详细将一些最优化问题是如何从现实映射的抽象的问题空间,然后通过最优化问题求出的最优解的整体过程详细分享一下。

现在关注我,你就是长老级粉丝了呦!♥
posted @ 2022-03-23 20:40  greysky2022  阅读(774)  评论(0)    收藏  举报