場景:已知f(x1,x2)=-x1^2-3*x2^2+2*x1*x2+6,求當f(x1,x2)取得最大值時,x1和x2的值分別是多少?
f(x1,x2)對x1的偏導:f_x1=-2*x1+2*x2,令f_x1=0,=》x1=x2;
f(x1,x2)對x2的偏導:f_x2=-6*x2+2*x1,令f_x2=0,=》x2=1/3*x1。
在座標上公升的過程中,當每次沿著某個座標軸尋找多元函式f的最大值時,該座標軸對應的變數被更新為偏導為0時對應的值,其餘座標軸對應的變數保持不變。
繪製函式f(x1,x2)=-x1^2-3*x2^2+2*x1*x2+6的影象:
# 匯入相關包
%matplotlib notebook
from matplotlib import pyplot as plt
import numpy as np
# 繪製函式影象
fig = plt.figure()
ax = plt.axes(projection='3d')
x1 = np.arange(-4, 4, 0.25)
x2 = np.arange(-4, 4, 0.25)
x1, x2 = np.meshgrid(x1, x2)
z = -x1**2-3*x2**2+2*x1*x2+6
ax.plot_su***ce(x, y, z, rstride=1, cstride=1, cmap='rainbow')
ax.set(xlabel='x',ylabel='y',zlabel='z')
函式影象如下圖所示:
採用座標上公升法求解f(x1,x2)取得最大值時,x1和x2的值:
plt.figure()
cs=plt.contour(x,y,z)#畫等高線
#初始化x1和x2的值
x1_list =
x2_list =
j = 1
for i in range(200):
x1_tmp = x2_list[j-1] # 沿著x1軸對x1和x2進行更新
j = j+1
x2_tmp = x1_list[j-1] / 3 # 沿著x2軸對x1和x2進行更新
plt.plot(x1_list,x2_list)
max_x1=x1_list[-1]
max_x2=x2_list[-1]
print('當取最大值的時候,x1的取值為:', max_x1)
print('當取最大值的時候,x2的取值為:', max_x2)
print('max f:',-(max_x1**2)-3*(max_x2**2)+2*max_x1*max_x2+6)
plt.title('coordinate descent')
plt.xlabel('x')
plt.ylabel('y')
迭代過程如圖下所示:
上圖黃色橢圓曲線中的藍色階梯狀折線展示了座標上公升的迭代過程。
除此之外,上述**還輸出:
當取最大值的時候,x1的取值為: 0.6666666666666666
當取最大值的時候,x2的取值為: 0.2222222222222222
max f: 5.703703703703704
參考: 點 結構式 在三維座標上平移,Python實現
沒有廢話,直接上 記得要宣告point類 結構式在三維座標上平移,預設將下標為0的點移動到某個位置,其它點同樣平移 這個listpoint可能只是乙個片段 staticmethod defstructuremoveto listpoint,movetopoint,index 0 if0 index ...
利用python實現排序,並標上序號
需求 利用python實現排序功能 測試資料 data.csv id date amount 1 2019 02 08 6214.23 1 2019 02 08 6247.32 1 2019 02 09 85.63 2 2019 02 14 943.18 2 2019 02 15 369.76 2 ...
python 實現演算法 Python實現演算法 一
1.二分查詢 def binary search mylist,item low 0 high len mylist 1 while low high mid low high 2 如果 low high 2不是偶數,python自動將mid向下圓整。guess mylist mid if gues...