MATLAB中gradient计算曲线斜率与手动计算结果不符问题
斜率计算结果不匹配的原因
你得到的结果和手动计算不一致,核心是代码里梯度计算的参数传错,计算的导数和你绘图、手动取点计算的导数根本不是同一组变量的变化率:
- 你代码里写的
sl = gradient(y,x),按照MATLAB的gradient(函数值, 自变量)语法,这行计算的是y对x的导数dy/dx,但你绘图用的是plot(inx,y),图上横轴是inx、纵轴是y,你手动取点算的是Δy/Δinx,两个斜率的物理意义完全不同,结果自然不匹配。 - 你现在代码算出0.25是必然结果:
x是1到5均匀生成的1001个点,相邻点间隔为(5-1)/(1001-1)=0.004;y是-1到0均匀生成的1001个点,相邻点间隔为(0 - (-1))/(1001-1)=0.001。均匀序列的内部点数值梯度就是间隔比值0.001/0.004=0.25,不管你取哪个索引位置,返回的梯度值都是0.25,这个值和inx变量没有任何关系。 - 如果你要计算绘制出的
y-inx曲线在目标位置的斜率,需要把梯度计算的自变量替换成inx,正确代码如下:
% 替换原代码中sl的赋值行,计算y对inx的导数,即图中曲线的斜率 sl = gradient(y, inx); s1_po = sl(idinx)
注意:你的
inx是随x增大单调递减的序列(因为inx = mep./x),find(inx > dinx,1)返回的是序列开头(inx值最大的一侧)第一个满足阈值条件的点索引,手动取点计算时不要找错对应位置,否则也会出现数值误差。
内容的提问来源于stack exchange,提问作者Jasmine
相关产品推荐
相关产品推荐

