0124程式設計-偏微分和梯度繪圖-Plotly
結合上一篇文章理解下圖中標出的偏導數(斜率)和梯度示意。

注意圖中兩個紅色箭頭指示出曲面兩端的高低不同,所以沿y方向的斜率更大。圖中紫色線條指示為負梯度方向,即梯度下降方向。
這個圖形的Ploly程式碼如下:
#二元函式 import plotly.offline as py import plotly.graph_objs as go import random import math py.init_notebook_mode() #原函式 def func(x, y): res = math.pow(x, 3) + math.pow(y, 3) + 2 * x + 400 * y return res #求x方向偏導 def slopex(x, y): res = 3 * math.pow(x, 2) + math.pow(y, 3) + 400 * y return res #求y方向偏導 def slopey(x, y): res = math.pow(x, 3) + 3 * math.pow(y, 2) + 2 * x return res #------------------------------------資料 #繪製表面 surf = go.Surface( z=[[func(x, y) for x in range(0, 20)] for y in range(0, 20)], opacity=0.85, colorscale='Hot', showscale=False, ) #點位置 point = dict(x=15, y=15, z=func(15, 15)) #繪製藍色的y方向走向的細線 liney = go.Scatter3d( x=[n for n in range(0, 21)], y=[point['y'] for n in range(0, 20)], z=[func(n, point['y']) for n in range(0, 21)], line=dict(width=2, color='blue'), mode='lines') #繪製藍色的x方向走向的細線 linex = go.Scatter3d( y=[n for n in range(0, 21)], x=[point['x'] for n in range(0, 21)], z=[func(point['x'], n) for n in range(0, 21)], line=dict(width=2, color='blue'), mode='lines') #繪製點和斜率線、梯度線 def drawLines(p): #繪製點 marker = go.Scatter3d( x=[p['x']], y=[p['y']], z=[func(p['x'], p['y'])], marker=dict(size=5, color='blue'), mode='markers') #斜率的放縮值,根據影象需要任意設定 slopeScale=0.0005 #x方向斜率線,只繪出開始和結束點 lineSlopex = go.Scatter3d( x=[p['x']] * 2, y=[p['y'], p['y'] + slopex(p['x'], p['y']) * slopeScale], z=[func(p['x'], p['y'])] * 2, line=dict(width=8, color='rgb(0,255,0)'), mode='lines') #y方向斜率線,只繪出開始和結束點 lineSlopey = go.Scatter3d( x=[p['x'], p['x'] + slopey(p['x'], p['y']) * slopeScale], y=[p['y']] * 2, z=[func(p['x'], p['y'])] * 2, line=dict(width=8, color='rgb(0,255,0)'), mode='lines') #x、y方向斜率線相加得到梯度方向向量 lineGradient = go.Scatter3d( x=[p['x'], p['x'] + slopey(p['x'], p['y']) * slopeScale], y=[p['y'], p['y'] + slopex(p['x'], p['y']) * slopeScale], z=[func(p['x'], p['y'])] * 2, line=dict(width=8, color='rgb(255,0,0)'), mode='lines') #負梯度方向向量,即梯度下降向量 lineDescent = go.Scatter3d( x=[p['x'], p['x'] - slopey(p['x'], p['y']) * slopeScale], y=[p['y'], p['y'] - slopex(p['x'], p['y']) * slopeScale], z=[func(p['x'], p['y'])] * 2, line=dict(width=8, color='rgb(255,0,255)'), mode='lines') return [lineSlopex, lineSlopey, lineGradient, lineDescent, marker] datas = [surf, linex, liney] datas = datas + drawLines(point) #----------------------------------------繪圖 layout = go.Layout( title='f(x,y)=x^3+y^3+2*x+400*y', width=800, height=800, scene=dict( xaxis=dict(title='x'), yaxis=dict(title='y'), zaxis=dict(title='f(x,y)'), )) fig = go.FigureWidget(datas, layout=layout) py.iplot(fig)
每個人的智慧新時代
如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,歡迎轉載~
END