Python优化算法,python优化函数

  Python优化算法,python优化函数

  

python视频教程栏目介绍各种最优化算法

  相关免费学习推荐:python视频教程

  00-1010函数可以在rre中找到。这段代码使算法运行两次。

  def asdf(x):

  rres=8*x**3-2*x**2-7*x 3

  返回rres

  i=2

  左=0

  右=1

  而i0 :

  i=i-1

  ans=0.1

  mid1=(左右ans)/2

  mid2=(左-右- ans)/2

  a=asdf(中间1)

  c=asdf(中间2)

  如果一个c :

  右=中间1

  else :

  左=中间2

  b=(左/右)/2

  Print(左极限=%s,右极限=%s,最小值x=%s%(left,right,b))左极限=0.45,右极限=0.775,最小值x=0.6125 Harvest:

  这是我实现的第一个代码。学完这个算法,逻辑框架基本具备,唯一需要明确的就是对应的python语言。于是开始寻找“如何定义函数”(详见莫凡优酷)、“循环体”、“if条件语句”的格式(https://blog . csdn . net/QQ _ 39407518/article/details/79822498)、“数学符号”(详见莫凡优酷)、print的使用。

  1.def指python中的定义,一般用来定义函数。如果需要深度学习来构建网络,可以用它来定义网络。值得注意的是

  Return必须添加在函数后的新行上。

  不知道为什么,如果不加,那个函数公式就是花瓶,就像一个结果不能丢一样。

  2.最坑的是逻辑。一开始逻辑不太清楚,或者代码有疏漏,导致我把左右放在循环里。结果可想而知。但也因为这个错误,我知道了如何在pycharm中使用debug。挺简单的,百度一下就出来了。

  3.不知道为什么,在视频里看打印多个变量一起输出的时候在我的pycharm里没有办法用,结果很奇怪。可能是因为我是win10,不是ios。如果一起输出打印变量,则必须是print (name: %s,name 2:% s% (a,b))。结果输出是name: a,name 2: b。

  

二分法

return表示输出该def中的任何变量值,并将其显示为结果。一般来说就是输出函数的关系表达式的命名,这样当你调用这个函数的时候,就可以显示出变量对应的函数值,否则只有运行没有结果,没有效果。

  

问题:1.为什么要加return?
将numpy作为np导入

  def qwer(x):

  third=np.exp(x) - 5*x

  返回第三

  左=1

  右=2

  mid1=浮点型(左/右)/2

  mid2=(左mid1)/2

  mid3=(mid1 right) /2

  a=qwer(mid1)

  b=qwer(mid2)

  c=qwer(mid3)

  i=5

  而我0:

  i=i-1

  如果是b:

  如果c b :

  #b

  右=中间1

  mid1=mid2

  a=b

  mid2=(左mid1)/2

  mid3=(mid1 right)/2

  b=qwer(mid2)

  c=qwer(mid3)

  else: #公元前

  #c

  左=中间1

  mid1=mid3

  a=c

  mid2=(左mid1)/2

  mid3=(mid1 right)/2

  b=qwer(mid2)

  c=qwer(mid3)

  else:#ba

  如果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<ggb

   left = b

   b = a

   a = left + 0.618 * (right - left)

   ggb = gga

   gga = gold(a)

   else:

   break

不知道自己什么时候有的强迫症,只要是代码下面有“~”我就必须要消掉。笑哭。这个很简单,前四个除了费波纳茨,都很简单。

  

间接法——二次插值法

def yy(x):

   y=x**4-4*x**3-6*x**2-16*x+4

   return y

  def xing(xm1,xm2,xm3,fm1,fm2,fm3):

   yxxx=0.5000*((xm2**2-xm3**2)*fm1+(xm3**2-xm1**2)*fm2+(xm1**2-xm2**2)*fm3)/((xm2-xm3)*fm1+(xm3-xm1)*fm2+(xm1-xm2)*fm3)

   return yxxx

  x1 = -1.0000

  f1 = yy(x1)

  x3 = 6

  f3 = yy(x3)

  x2 = 0.50000*(x1+x3)

  f2 = yy(x2)

  xp = xing(x1,x2,x3,f1,f2,f3)

  fp = yy(xp)

  a = abs(xp-x2)

  while abs(xp-x2) > 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<x2

   if fp > 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("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")

   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,这些语言都充满了挑战性。我觉得当你疑惑的时候,就需要相信直觉,至少我发现它很准以上就是python实现各种最优化算法的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: