1. 程式人生 > 其它 >如何繪製任意函式的一階導數影象

如何繪製任意函式的一階導數影象

1,思路

  • 根據定義
\[\frac{dy}{dx}=\lim_{\Delta{x\to{0}}}\frac{\Delta{y}}{\Delta{x}} \]

而為了使得上式在計算機中可計算,就體現出了泰勒展開的重要性

  • 使用pytorch的自動求導功能(結合nn.Parameter以及backward()自動求導)

2,例子

'''使用pytorch'''
import torch
import torch.nn as nn
import numpy as np
from matplotlib import pyplot as plt
aList = np.arange(-10, 10, 0.01)
resList = []
gradList = []
func = torch.sin
for a in aList:
    a = nn.Parameter(torch.tensor(a))
    b = func(a)
    resList.append(b.item())
    b.backward()
    gradList.append(a.grad.item())

plt.plot(aList, resList, label='sin')
plt.plot(aList, gradList, label='grad')
plt.plot(aList, [np.cos(i) for i in aList], '-.', label='cos')
plt.legend()
plt.savefig('求導.jpg')
plt.show()
'''使用定義'''
import torch
import torch.nn as nn
import numpy as np
from matplotlib import pyplot as plt
aList = np.arange(-10, 10, 0.01)
resList = [np.sin(i) for i in aList]
gradList = [(torch.sin(torch.tensor(i+0.01, dtype=torch.float64))-torch.sin(torch.tensor(i, dtype=torch.float64))).item()/0.01 for i in resList]
plt.plot(aList, resList, label='sin')
plt.plot(aList, gradList, label='grad')
plt.plot(aList, [np.cos(i) for i in aList], '-.', label='cos')
plt.legend()
plt.savefig('求導.jpg')
plt.show()

3,問題

那麼問題來了,根據定義就算是將tensor轉為torch.float64依舊因為計算的近似導致結果的不準確,那麼pytorch的底層使用什麼方法做到精確求導的呢?