SiH*_*iHa 70
另外在文档1中:
>>> y = np.array([1, 2, 4, 7, 11, 16], dtype=np.float)
>>> j = np.gradient(y)
>>> j
array([ 1. , 1.5, 2.5, 3.5, 4.5, 5. ])
Run Code Online (Sandbox Code Playgroud)
y
)/(改变x
).x
,这里是索引,因此相邻值之间的差值为1.
在边界处,计算第一个差异.这意味着在数组的每一端,给出的梯度就是简单的,结束两个值之间的差异(除以1)
因此,y
上面的梯度计算如下:
j[0] = (y[1]-y[0])/1 = (2-1)/1 = 1
j[1] = (y[2]-y[0])/2 = (4-1)/2 = 1.5
j[2] = (y[3]-y[1])/2 = (7-2)/2 = 2.5
j[3] = (y[4]-y[2])/2 = (11-4)/2 = 3.5
j[4] = (y[5]-y[3])/2 = (16-7)/2 = 4.5
j[5] = (y[5]-y[4])/1 = (16-11)/1 = 5
Run Code Online (Sandbox Code Playgroud)
例如,您可以在结果数组中找到所有绝对值的最小值,以查找曲线的转折点.
1实际上x
在文档的示例中调用了数组,我已将其更改y
为避免混淆.
Rob*_*PhD 15
这是发生了什么。给定接近点的值,泰勒级数展开式指导我们如何近似导数。最简单的来自 C^2 函数(两个连续导数)的一阶泰勒级数展开...
可以求解 f'(x)...
我们能做得更好吗?确实是的。如果我们假设 C^3,那么泰勒展开式是
减去这些(h^0 和 h^2 项都去掉!)并求解 f'(x):
因此,如果我们在等距分区上定义了一个离散化函数:x = x_0,x_0+h(=x_1),....,x_n=x_0+h*n,那么 numpy 梯度将使用末端的一阶估计和中间的更好的估计。
示例 1.如果不指定任何间距,则假定间隔为 1。因此,如果您调用
f = np.array([5, 7, 4, 8])
Run Code Online (Sandbox Code Playgroud)
你说的是 f(0) = 5, f(1) = 7, f(2) = 4, and f(3) = 8。然后
np.gradient(f)
Run Code Online (Sandbox Code Playgroud)
将是: f'(0) = (7 - 5)/1 = 2, f'(1) = (4 - 5)/(2*1) = -0.5, f'(2) = (8 - 7 )/(2*1) = 0.5,f'(3) = (8 - 4)/1 = 4。
示例 2.如果指定单个间距,则间距是统一的但不是 1。
例如,如果您调用
np.gradient(f, 0.5)
Run Code Online (Sandbox Code Playgroud)
这就是说 h = 0.5,而不是 1,即函数实际上是 f(0) = 5, f(0.5) = 7, f(1.0) = 4, f(1.5) = 8。净效果是将 h = 1 替换为 h = 0.5,所有结果都会翻倍。
例 3.假设离散函数 f(x) 没有定义在均匀间隔的区间上,例如 f(0) = 5, f(1) = 7, f(3) = 4, f(3.5) = 8, 那么numpy 梯度函数使用了一个更混乱的离散化微分函数,您将通过调用获得离散化导数
np.gradient(f, np.array([0,1,3,3.5]))
Run Code Online (Sandbox Code Playgroud)
最后,如果您的输入是一个二维数组,那么您正在考虑在网格上定义的 x, y 函数 f。numpy 梯度将输出 x 和 y 中“离散化”偏导数的数组。
归档时间: |
|
查看次数: |
27212 次 |
最近记录: |