本文摘自php中文网,作者coldplay.xixi,侵删。
python视频教程栏目介绍各种最优化算法
相关免费学习推荐:python视频教程
二分法
函数详见rres,此代码使该算法运行了两次
def asdf(x):
rres=8*x**3-2*x**2-7*x+3
returnrres
i=2
left=0
right=1
whilei>0 :
i = i-1
ans = 0.1
mid1 = (left + right + ans) / 2
mid2 = (left + right - ans) / 2
a=asdf(mid1)
c=asdf(mid2)
ifa > 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 numpyasnp
def qwer(x):
third = np.exp(x) - 5*x
returnthird
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
whilei > 0:
i=i-1
ifa > b:
ifc > 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
ifa > 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
fori in range(n):
i=i+1
c = a+b
a = b
b = c
returnc
def bn(x):
ert = x**2 - 6*x + 2
returnert
z = 2
p = 0
left = 0.00000
right = 10.00000
L1 = right - left
whilez < 100:
m = fibonacci(z)
l = L1/m
k = 1.000/m
ifk < 0.03:
print("n=%s,Fn=%s"%(z,m))
L2 = l*fibonacci(z-1)
t = left + L2
r = right -L2
whilep < 3:
p = p + 1
l3 = t - r
e= bn(t)
o = bn(r)
ife>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
returngg
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
whilei < 7:
print("i=%s"% i)
print("left=%s,right=%s"% (left, right))
print("x左=%s,x右=%s"%
相关阅读 >>
更多相关阅读请进入《Python》频道 >>

Python编程 从入门到实践 第2版
python入门书籍,非常畅销,超高好评,python官方公认好书。