Python干货python实现最优化算法
二分法
函数详见rres,此代码使该算法运行了两次def asdf(x): rres=8*x**3-2*x**2-7*x+3 return rres i=2 left=0 right=1 while i>0 : i = i-1 ans = 0.1 mid1 = (left + right + ans) / 2 mid2 = (left + right - ans) / 2 a=asdf(mid1) c=asdf(mid2) if a > c : right = mid1 else : left = mid2 b=(left+right) / 2 print("左极限=%s,右极限=%s,极小值x=%s"%(left,right,b))左极限=0.45,右极限=0.775,极小值x=0.6125
收获:
这是我第一个实现的代码。学习完该算法以后,逻辑框架基本上就有了,剩下需要明确的就是对应的python的语言。于是我就开始了查找"如何定义函数"(详见mofan的优酷),"循环体"和"if条件语句"的格式(https://blog.csdn.net/qq_39407518/article/details/79822498)"数学符号"(详见mofan的优酷),以及print的使用
1.def是python中指定义,一般用来定义函数,如果需要深度学习搭建网络可用来定义网络。值得注意的一点是
return必须要加在函数后面另起一行。
我不清楚为什么,但是如果没有加的话,那个函数公式就是一个花瓶,就像一个结果输不出去。
2.最坑的就是逻辑。一开始逻辑没理清楚,或者说在代码上有疏漏,导致我将left和right放在了循环体里,结果可想而知。不过也是因为这个错误,我知道pycharm中的debug怎么用,挺简单的,百度一下就出来了。
3.不知道什么原因,看的莫烦视频中的print多个变量一起输出是没有办法在我的pycharm中使用的,出来的结果很奇怪。可能是因为我是win10不是ios吧。print如果多个变量一起输出必须是print("名字:%s,名字2:%s"%(a,b))结果输出就是名字:a ,名字2:b问题:1.为什么要加return?
return的意思是输出这个def里面任意一个变量值作为结果显示。一般情况而言,是输出函数的关系式的命名,这样当你调用这个函数的时候,变量对应的函数值才能显示出来,否则只运行没有结果,不会有效果。格点法——三点等分法import numpy as np def qwer(x): third = np.exp(x) - 5*x return third left = 1 right = 2 mid1 =float(left+right) / 2 mid2 = (left+mid1) / 2 mid3 = (mid1+right) /2 a = qwer(mid1) b = qwer(mid2) c = qwer(mid3) i = 5 while i > 0: i=i-1 if a > b: if c > b : #b right = mid1 mid1 = mid2 a=b mid2 = (left + mid1) / 2 mid3 = (mid1 + right) / 2 b = qwer(mid2) c = qwer(mid3) else:#b>c #c left = mid1 mid1 = mid3 a = c mid2 = (left + mid1) / 2 mid3 = (mid1 + right) / 2 b = qwer(mid2) c = qwer(mid3) else:#b>a if a > c: #C left = mid1 mid1 = mid3 a = c mid2 = (left + mid1) / 2 mid3 = (mid1 + right) / 2 b = qwer(mid2) c = qwer(mid3) else:#b>a&c>a # a left = mid2 right = mid3 mid2 = (left + mid1) / 2 mid3 = (mid1 + right) / 2 b = qwer(mid2) c = qwer(mid3) print("最小值=%s"%mid1) print("函数值=%s"%a)最小值=1.609375 函数值=-3.047189552275773
关于python中数据变量。第一遍运行结果出现很明显不对,于是我采用了debug。结果发现,mid1处一直为1而不是1.5,于是就开始了解数据变量。起初我猜测python默认所有变量为整型,但是根据二分法的结果我意识到此猜测不对,所以要改整个file的变量格式没有必要。所以我就在mid1式子前面加了一个float,结果就显示为1.5了。但是如果我将整个式子用()括起来,前面加float,结果还是1。我不太理解为什么。不过我知道了python的数据格式是根据输入量决定的,也就是说你的输入量如果是整型,那么与其直接相关的计算输出结果一定是整型,而且还是不采用进位的整型。在我没有采用+float/+.0这两种方法之前,mid1~3全部是整型。left = 1.0 right = 2.0 mid1 =(left+right) / 2
或者不再mid1前面加float,直接将输入量后面点个点就行
真的很想吐槽一下print,好麻烦啊啊啊啊每次都得弄个%s,而且有时候还不能放一起!!!!Fibonacci法def fibonacci(n): i=0 a = 0 b = 1 for i in range(n): i=i+1 c = a+b a = b b = c return c def bn(x): ert = x**2 - 6*x + 2 return ert z = 2 p = 0 left = 0.00000 right = 10.00000 L1 = right - left while z < 100: m = fibonacci(z) l = L1/m k = 1.000/m if k < 0.03: print("n=%s,Fn=%s"%(z,m)) L2 = l*fibonacci(z-1) t = left + L2 r = right -L2 while p < 3: p = p + 1 l3 = t - r e= bn(t) o = bn(r) if e>o : right = t t = r r = left + l3 else:#o>e left = r r = t t = right - l3 break else: z = z + 1 okk=(left+right)/2 okky=bn(okk) print(left) print(right) print("极小值x=",okk) print("极小值y=",okky)
不要问我掌握了什么,要问我现在写完这个代码后有多么的爱python的精度表示 :-)我决定以后只要再编写数学公式的代码都将输入量的小数学点后面补很多0
fibonacci函数定义,每次debug后我的手都是抖的O( _ )O~黄金分割法def gold(x): gg= x**2 - 6*x + 9 return gg left = 1 right = 7 ans = 0.4 a = left + 0.618 * (right - left) b = left + 0.382*(right - left) gga = gold(a) ggb = gold(b) i = 0 while i < 7: print("i=%s" % i) print("left=%s,right=%s" % (left, right)) print("x左=%s,x右=%s" % (a, b)) print("y左=%s,y右=%s" % (ggb, gga)) c = right - left if c > 0.4: i = i + 1 if gga > ggb: right = a a = b b = left + 0.382*(right - left) gga = ggb ggb = gold(b) else:#gga 0.05000: a = abs(xp - x2) if xp > x2: if fp > f2: x3=xp f3=fp xp = xing(x1, x2, x3, f1, f2, f3) fp = yy(xp) print("ans=%s" % a) print("left=%s,right=%s" % (x1, x3)) print("x*=%s,fp*=%s" % (xp, fp)) print("x2=%s,f2=%s" % (x2, f2)) print("******************") else:#f2>fp x1 = x2 f1 = f2 x2 = xp f2 = fp xp = xing(x1, x2, x3, f1, f2, f3) fp = yy(xp) print("ans=%s" % a) print("left=%s,right=%s" % (x1, x3)) print("x*=%s,fp*=%s" % (xp, fp)) print("x2=%s,f2=%s" % (x2, f2)) print("******************") else:#xp f2: x1 = xp f1 = fp xp = xing(x1, x2, x3, f1, f2, f3) fp = yy(xp) print("ans=%s" % a) print("left=%s,right=%s" % (x1, x3)) print("x*=%s,fp*=%s" % (xp, fp)) print("x2=%s,f2=%s" % (x2, f2)) print("******************") else: x3 = x2 f3 = f2 x2 = xp f2 = fp xp = xing(x1, x2, x3, f1, f2, f3) fp = yy(xp) print("ans=%s" % a) print("left=%s,right=%s" % (x1, x3)) print("x*=%s,fp*=%s" % (xp, fp)) print("x2=%s,f2=%s" % (x2, f2)) print("******************")
这个公式看起来很麻烦,便写的时候更要谨慎。我上回把那个2搁在了分号下面,结果很大,所以还是换算成0.5更好(PS:勿忘那长河般的0)。
虽然代码很长,但是主要是因为print太多。本打算在开头print,最后结果会漏掉最后一部分。懒得想其他办法了,直接就这样吧间接法——牛顿法def fd(x): y = 4*x**3-12*x**2-12*x-16 return y def fdd(x): ys = 12*x**2-24*x-12 return ys i = 1 x0 = 3.00000 ans = 0.001 while i < 7: fd0 = fd(x0) fdd0 = fdd(x0) if abs(fd0) > ans: x1 = x0 - (fd0/fdd0) x0 = x1 print("次数:%s,所得的值x:%s"%(i,x1)) i = i + 1 else:#fd0<0.001 print("$$$$$$$$$$$$$$$#34;) print("Bingo!顺利通关!祝您开学愉快!") print("Boss X=%s"%x0) break
一开始while里面<写成了>,导致run不出来。继而,debug也没法用。在网上一查才知道 "没联网"+"没选断点"。最后想尝试将else里面的内容输出来,结果发现run以后被刷屏了。于是改成i<7以后还是不行,于是想着加一个break跳出循环,结果成效了。
然后刚刚由debug了一下,才知道原来是i+1在if里面,因为没有办法+1,所以i=6一直存在,就不断循环。因为加break也好,i+1也好,都可以。就在一个半小时前,我成功搞完了最优化六大代码,纯手打,无外力。开心!
这是我第一组自己实现的python代码,就是数学公式用python语言组装起来。刚开始的时候知道大概需要在语言中体现什么,但不太清楚。于是我就在网上找了几个二分法的,他们都各有不同,但框架都差不多,不过如果要用到我们的那个公式里还需要改变很多。然后我就开始分析我们的题,我发现大体需要两部分,一部分函数定义,一部分循环体。但我不知道如何定义函数,如何写数学公式,如何弄变量,也就是说一些小点不太会,所以我选择直接百度。因为我知道自己阅读的能力不错,相比于从视频中提取要素,我更擅长通过阅读获得要点。有目的性地找知识点,掌握地更牢固。
于是我就开始了第一个——二分法的编写。我发现,自己出现了很多错误而且有很多地方都很基础。但我依然没选择视频,而是将这些问题直接在百度上找,因为视频讲完或许你也没找到点。当然,这是一步一步走的,不是直接就将程序摆上去,一点一点改。
随着前两个的成功,我发现自己对于这些代码有了自信,似乎看透了他们的伪装,抓住了本质。除此之外,我还意识到自己自从8月份以后,学习能力似乎提高了不少,而且有了更为有效的学习方法。各方面都有了一定的觉醒。除了第一个找了几个牛头不对马嘴的代码,其他都是根据自己的逻辑写,逻辑通下来以后,对应语言中某一部分不知道如何翻译就去百度,其实这几个套路都一样或者说数学公式转化的套路都一样。
我还意识到,汇编其实是最难的语言,目前为止所学到的,因为很多都需要自己去定义,去死抠,需要记住大量的指令且不能灵活变通。但是其他的却只需要将一些对应的记下来就好。python真的挺简单的。而且,我发现自己今天似乎打开了新世界的大门,我爱上了这种充满了灵性的东西,充满了严谨的美丽,还有那未知的变化,我发现我似乎爱上了代码。可能不仅仅局限于python,这些语言都充满了挑战性。我觉得当你疑惑的时候,就需要相信直觉,至少我发现它很准最后
如果文章对您有帮助,点赞+关注,您的支持是我最大的动力
磁吸生态,让iPhone更好用,PITAKA车载磁吸无线充电套装分享很多小伙伴用手机都会陷入这样的纠结既想要裸机的手感,又怕摔坏修起来太贵,肉疼。所以,总有小伙伴问我,有没有兼顾手感和安全性的解决方案?关于这个问题,可以很肯定地告诉大家,有的,芳纶
UNIK美学新主张领航者不止要站在时代尖端更要造就独特夺目于车海与平庸陌路生而自成宇宙不因喧嚣而黯淡,注定卓显于群。边界进气格栅UNI序列独创的无边界设计,打破汽车百年传统格栅形态。以参数化手法创建六边形
UNIK高端与科幻感智慧之光,赋予灯光先进的智慧价值。智慧关怀,给予最舒适的陪伴舒适静享,让你的每一次礼遇都不将就哪怕方寸之间,也要让美好全力绽放。索尼高级车载音响系统搭载索尼高级车载音响系统,配备1
UNIT以雷霆之势驭运动之风UNIT运动版以雷霆之势驭运动之风惊鸿一瞥,目光再无去意。从此,世间焦点皆止于此。UNIT动感的体态在耀夜极光运动套件加持下,淬炼出一触即发的视觉印象,目之所及,皆为凌厉动势12款
UNIK生而自成宇宙不止要站在时代尖端更要造就独特夺目于车海与平庸陌路生而自成宇宙不因喧嚣而黯淡,注定卓显于群。边界进气格栅UNI序列独创的无边界设计,打破汽车百年传统格栅形态。以参数化手法创建六边形
UNIK生而自成宇宙不止要站在时代尖端更要造就独特夺目于车海与平庸陌路生而自成宇宙不因喧嚣而黯淡,注定卓显于群。边界进气格栅UNI序列独创的无边界设计,打破汽车百年传统格栅形态。以参数化手法创建六边形
golang2021数据格式(59)结构体有时我们需要将不同类型的数据组合成一个有机的整体,如一个学生有学号姓名性别年龄地址等属性。显然单独定义以上变量比较繁琐,数据不便于管理。结构体是一种聚合的数据类型,它是由一系列具有
golang2021数据格式(57)map相等吗map深度相等的条件1hr231都为nil2非空长度相等,指向同一个map实体对象3相应的key指向的value深度相等直接将使用map1map2是错误的。这种写法只能比较map是
golang2021数据格式(58)模式处理集合元素从处理集合元素聊起日常开发过程中,要处理数组切片字典等集合类型,常规做法都是循环迭代进行处理。比如将一个字典类型用户切片中的所有年龄属性值提取出来,然后求和,常规实现是通过循环遍历
golang2021数据格式(60)结构体初始化注意顺序初始化,每个成员必须初始化,在初始化时,值的顺序与结构体成员的顺序保持一致。结构体定义完成后,结构体成员的使用。普通变量typeStudentstructidintname
手机摄影的天花板能有多高?vivoX70Pro实拍样张告诉你就在昨天,备受关注的vivoX70系列正式发布,该系列机型在设计性能交互上带来全面升级的同时,更在手机影像上再一次实现了突破。那么在蔡司与vivo的深度合作下,定位于专业影像旗舰的