資訊內(nèi)容
python實(shí)現(xiàn)各種最優(yōu)化算法
nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
相關(guān)免費(fèi)學(xué)習(xí)推薦:python視頻教程nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
二分法函數(shù)詳見(jiàn)rres,此代碼使該算法運(yùn)行了兩次nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
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收獲:
這是我第一個(gè)實(shí)現(xiàn)的代碼。學(xué)習(xí)完該算法以后,邏輯框架基本上就有了,剩下需要明確的就是對(duì)應(yīng)的python的語(yǔ)言。于是我就開(kāi)始了查找“如何定義函數(shù)”(詳見(jiàn)mofan的優(yōu)酷),“循環(huán)體”和“if條件語(yǔ)句”的格式(https://blog.csdn.net/qq_39407518/article/details/79822498)“數(shù)學(xué)符號(hào)”(詳見(jiàn)mofan的優(yōu)酷),以及print的使用nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
1.def是python中指定義,一般用來(lái)定義函數(shù),如果需要深度學(xué)習(xí)搭建網(wǎng)絡(luò)可用來(lái)定義網(wǎng)絡(luò)。值得注意的一點(diǎn)是nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
return必須要加在函數(shù)后面另起一行。nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
我不清楚為什么,但是如果沒(méi)有加的話,那個(gè)函數(shù)公式就是一個(gè)花瓶,就像一個(gè)結(jié)果輸不出去。nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
2.**坑的就是邏輯。一開(kāi)始邏輯沒(méi)理清楚,或者說(shuō)在代碼上有疏漏,導(dǎo)致我將left和right放在了循環(huán)體里,結(jié)果可想而知。不過(guò)也是因?yàn)檫@個(gè)錯(cuò)誤,我知道pycharm中的debug怎么用,挺簡(jiǎn)單的,百度一下就出來(lái)了。nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
3.不知道什么原因,看的莫煩視頻中的print多個(gè)變量一起輸出是沒(méi)有辦法在我的pycharm中使用的,出來(lái)的結(jié)果很奇怪。可能是因?yàn)槲沂莣in10不是ios吧。print如果多個(gè)變量一起輸出必須是print("名字:%s,名字2:%s"%(a,b))結(jié)果輸出就是名字:a ,名字2:bnSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
問(wèn)題:1.為什么要加return?return的意思是輸出這個(gè)def里面任意一個(gè)變量值作為結(jié)果顯示。一般情況而言,是輸出函數(shù)的關(guān)系式的命名,這樣當(dāng)你調(diào)用這個(gè)函數(shù)的時(shí)候,變量對(duì)應(yīng)的函數(shù)值才能顯示出來(lái),否則只運(yùn)行沒(méi)有結(jié)果,不會(huì)有效果。nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
格點(diǎn)法——三點(diǎn)等分法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("函數(shù)值=%s"%a)**小值=1.609375 函數(shù)值=-3.047189552275773關(guān)于python中數(shù)據(jù)變量。第一遍運(yùn)行結(jié)果出現(xiàn)很明顯不對(duì),于是我采用了debug。結(jié)果發(fā)現(xiàn),mid1處一直為1而不是1.5,于是就開(kāi)始了解數(shù)據(jù)變量。起初我猜測(cè)python默認(rèn)所有變量為整型,但是根據(jù)二分法的結(jié)果我意識(shí)到此猜測(cè)不對(duì),所以要改整個(gè)file的變量格式?jīng)]有必要。所以我就在mid1式子前面加了一個(gè)float,結(jié)果就顯示為1.5了。但是如果我將整個(gè)式子用()括起來(lái),前面加float,結(jié)果還是1。我不太理解為什么。不過(guò)我知道了python的數(shù)據(jù)格式是根據(jù)輸入量決定的,也就是說(shuō)你的輸入量如果是整型,那么與其直接相關(guān)的計(jì)算輸出結(jié)果一定是整型,而且還是不采用進(jìn)位的整型。在我沒(méi)有采用+float/+.0這兩種方法之前,mid1~3全部是整型。nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
left = 1.0 right = 2.0 mid1 =(left+right) / 2或者不再mid1前面加float,直接將輸入量后面點(diǎn)個(gè)點(diǎn)就行
真的很想吐槽一下print,好麻煩啊啊啊啊每次都得弄個(gè)%s,而且有時(shí)候還不能放一起!!!!nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
不要問(wèn)我掌握了什么,要問(wèn)我現(xiàn)在寫(xiě)完這個(gè)代碼后有多么的愛(ài)python的精度表示 :-)我決定以后只要再編寫(xiě)數(shù)學(xué)公式的代碼都將輸入量的小數(shù)學(xué)點(diǎn)后面補(bǔ)很多0
fibonacci函數(shù)定義,每次debug后我的手都是抖的O(∩_∩)O~nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
不知道自己什么時(shí)候有的強(qiáng)迫癥,只要是代碼下面有“~”我就必須要消掉。笑哭。這個(gè)很簡(jiǎn)單,前四個(gè)除了費(fèi)波納茨,都很簡(jiǎn)單。nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
間接法——二次插值法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("******************")這個(gè)公式看起來(lái)很麻煩,便寫(xiě)的時(shí)候更要謹(jǐn)慎。我上回把那個(gè)2擱在了分號(hào)下面,結(jié)果很大,所以還是換算成0.5更好(PS:勿忘那長(zhǎng)河般的0)。
雖然代碼很長(zhǎng),但是主要是因?yàn)閜rint太多。本打算在開(kāi)頭print,**后結(jié)果會(huì)漏掉**后一部分。懶得想其他辦法了,直接就這樣吧 nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
一開(kāi)始while里面<寫(xiě)成了>,導(dǎo)致run不出來(lái)。繼而,debug也沒(méi)法用。在網(wǎng)上一查才知道 “沒(méi)聯(lián)網(wǎng)”+“沒(méi)選斷點(diǎn)”。**后想嘗試將else里面的內(nèi)容輸出來(lái),結(jié)果發(fā)現(xiàn)run以后被刷屏了。于是改成i<7以后還是不行,于是想著加一個(gè)break跳出循環(huán),結(jié)果成效了。
然后剛剛由debug了一下,才知道原來(lái)是i+1在if里面,因?yàn)闆](méi)有辦法+1,所以i=6一直存在,就不斷循環(huán)。因?yàn)榧觔reak也好,i+1也好,都可以。nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)
這是我第一組自己實(shí)現(xiàn)的python代碼,就是數(shù)學(xué)公式用python語(yǔ)言組裝起來(lái)。剛開(kāi)始的時(shí)候知道大概需要在語(yǔ)言中體現(xiàn)什么,但不太清楚。于是我就在網(wǎng)上找了幾個(gè)二分法的,他們都各有不同,但框架都差不多,不過(guò)如果要用到我們的那個(gè)公式里還需要改變很多。然后我就開(kāi)始分析我們的題,我發(fā)現(xiàn)大體需要兩部分,一部分函數(shù)定義,一部分循環(huán)體。但我不知道如何定義函數(shù),如何寫(xiě)數(shù)學(xué)公式,如何弄變量,也就是說(shuō)一些小點(diǎn)不太會(huì),所以我選擇直接百度。因?yàn)槲抑雷约洪喿x的能力不錯(cuò),相比于從視頻中提取要素,我更擅長(zhǎng)通過(guò)閱讀獲得要點(diǎn)。有目的性地找知識(shí)點(diǎn),掌握地更牢固。
于是我就開(kāi)始了第一個(gè)——二分法的編寫(xiě)。我發(fā)現(xiàn),自己出現(xiàn)了很多錯(cuò)誤而且有很多地方都很基礎(chǔ)。但我依然沒(méi)選擇視頻,而是將這些問(wèn)題直接在百度上找,因?yàn)橐曨l講完或許你也沒(méi)找到點(diǎn)。當(dāng)然,這是一步一步走的,不是直接就將程序擺上去,一點(diǎn)一點(diǎn)改。
隨著前兩個(gè)的成功,我發(fā)現(xiàn)自己對(duì)于這些代碼有了自信,似乎看透了他們的偽裝,抓住了本質(zhì)。除此之外,我還意識(shí)到自己自從8月份以后,學(xué)習(xí)能力似乎提高了不少,而且有了更為有效的學(xué)習(xí)方法。各方面都有了一定的覺(jué)醒。除了第一個(gè)找了幾個(gè)牛頭不對(duì)馬嘴的代碼,其他都是根據(jù)自己的邏輯寫(xiě),邏輯通下來(lái)以后,對(duì)應(yīng)語(yǔ)言中某一部分不知道如何翻譯就去百度,其實(shí)這幾個(gè)套路都一樣或者說(shuō)數(shù)學(xué)公式轉(zhuǎn)化的套路都一樣。
我還意識(shí)到,匯編其實(shí)是**難的語(yǔ)言,目前為止所學(xué)到的,因?yàn)楹芏喽夹枰约喝ザx,去死摳,需要記住大量的指令且不能靈活變通。但是其他的卻只需要將一些對(duì)應(yīng)的記下來(lái)就好。python真的挺簡(jiǎn)單的。而且,我發(fā)現(xiàn)自己今天似乎打開(kāi)了新世界的大門,我愛(ài)上了這種充滿了靈性的東西,充滿了嚴(yán)謹(jǐn)?shù)拿利悾€有那未知的變化,我發(fā)現(xiàn)我似乎愛(ài)上了代碼。可能不僅僅局限于python,這些語(yǔ)言都充滿了挑戰(zhàn)性。我覺(jué)得當(dāng)你疑惑的時(shí)候,就需要相信直覺(jué),至少我發(fā)現(xiàn)它很準(zhǔn)
以上就是python實(shí)現(xiàn)各種**優(yōu)化算法的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注少兒編程網(wǎng)其它相關(guān)文章!nSe少兒編程網(wǎng)-Scratch_Python_教程_免費(fèi)兒童編程學(xué)習(xí)平臺(tái)

- 上一篇
Python怎么判斷是哪一天
簡(jiǎn)介python判斷是哪一天的方法1:先判斷是否是閏年,然后再利用求和,得出某一天是第幾天# 方法1:low版def func1(year, month, day): # 分別創(chuàng)建平年,閏年的月份天數(shù)列表(注
- 下一篇
python中的注釋
簡(jiǎn)介python中的注釋:1、單行注釋(行注釋)Python中使用#表示單行注釋。單行注釋可以作為單獨(dú)的一行放在被注釋代碼行之上,也可以放在語(yǔ)句或表達(dá)式之后。2、多行注釋(塊注釋)當(dāng)注釋內(nèi)容過(guò)多,導(dǎo)致一行無(wú)法顯示時(shí),就可以使用多行注釋。Python中使用三個(gè)單引號(hào)或三個(gè)雙引號(hào)表示多行注釋。注意注釋不是越