日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python解决最优化问题_python实现最优化算法

發布時間:2025/3/12 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

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

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实现最优化算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。