Python退火算法在高次方程的应用-创新互联
一,简介
凤冈网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。创新互联公司2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。退火算法不言而喻,就是钢铁在淬炼过程中失温而成稳定态时的过程,热力学上温度(内能)越高原子态越不稳定,而温度有一个向低温区辐射降温的物理过程,当物质内能不再降低时候该物质原子态逐渐成为稳定有序态,这对我们从随机复杂问题中找出最优解有一定借鉴意义,将这个过程化为算法,具体参见其他资料。
二,计算方程
我们所要计算的方程是f(x) = (x - 2) * (x + 3) * (x + 8) * (x - 9),是一个一元四次方程,我们称为高次方程,当然这个函数的开口是向上的,那么在一个无限长的区间内我们可能找不出大值点,因此我们尝试在较短区间内解最小值点,我们成为最优解。
解法1:
毫无疑问,数学方法多次求导基本可以解出,但是这个过程较复杂,还容易算错,我就不赘述了,读者有时间自己可以尝试解一下。
解法二:
这个解法就是暴力解决了,我们这里只求解区间[-10,10]上的最优解,直接随机200个点,再除以10(这样可以得到非整数横坐标),再依此计算其纵坐标f(x),min{f(x)}一下,用list的index方法找出最小值对应位置就行了,然后画出图形大致瞄一瞄。
直接贴代码:
import random import matplotlib.pyplot as plt list_x = [] # for i in range(1): # #print(random.randint(0,100)) # for i in range(0,100): # print("sss",i) # # list_x.append(random.randint(0,100)) for i in range(-100,100): list_x.append(i/10) print("横坐标为:",list_x) print(len(list_x)) list_y = [] for x in list_x: # print(x) #y = x*x*x - 60*x*x -4*x +6 y = (x - 2) * (x + 3) * (x + 8) * (x - 9) list_y.append(y) print("纵坐标为:",list_y) #经验证,这里算出来的结果6.5和最优解1549都是对的 print("最小值为:",min(list_y)) num = min(list_y) print("最优解:",list_y.index(num)/10) print("第",list_y.index(num)/10-10,"个位置取得最小值") plt.plot(list_x, list_y, label='NM') #plt.plot(x2, y2, label='Second Line') plt.xlabel('X') #横坐标标题 plt.ylabel('Y') #纵坐标标题 #plt.title('Interesting Graph\nCheck it out',loc="right") #图像标题 #plt.title('Interesting Graph\nCheck it out') plt.legend() #显示Fisrt Line和Second Line(label)的设置 plt.savefig('C:/Users/zhengyong/Desktop/1.png') plt.show()
文章名称:Python退火算法在高次方程的应用-创新互联
浏览地址:http://myzitong.com/article/decssj.html