MATLAB中两种求导绘图方法的结果为何不一致?
为什么两种MATLAB求导绘图的振幅不一致?
这个问题的核心是你对MATLAB gradient函数的用法理解有误,咱们一步步拆解问题根源:
第一种方法的两个关键错误
你第一种方法的代码里,求导逻辑完全偏离了目标,导致结果和解析导数对不上:
- 拿错了梯度方向:
MATLAB的gradient函数处理二维数组时,会返回两个输出:[dx_grad, dt_grad],其中第一个是x方向的梯度,第二个才是t方向的梯度。但你只写了dr1=gradient(r1);,这时候dr1只保存了x方向的梯度,完全没拿到你需要的t方向导数——这是最致命的错误! - 导数缩放逻辑错误:
就算你拿到了正确的t方向梯度,你用dr1./min(diff(T))的计算方式也不对。gradient函数可以通过指定步长参数直接输出正确的导数值,不需要额外手动除以步长(而且你这里除以步长的对象还是x方向的梯度,完全南辕北辙)。
看你原代码的错误部分:
dr1=gradient(r1); % 只获取了x方向梯度,t方向梯度被丢弃 dr1dt=dr1./min(diff(T)); % 用x方向梯度除以步长,根本不是dr1/dt
第二种方法的正确性
第二种方法的解析求导是完全正确的:原函数r1 = m*sin(x+4t)对t求导,结果就是4*m*cos(x+4t)。你代码里最后的abs(r1)'转置其实是多余的(meshgrid生成的维度已经匹配),但这只会影响图像的方向,不会改变振幅。
修正第一种方法的代码
要让两种方法的结果一致,你需要正确调用gradient获取t方向的导数:
X=-1:.05:1; T=-1:.05:1; m=1+1*1i; [x,t]=meshgrid(X,T); r1=m.*sin(x+4.*t); % 用~忽略x方向梯度,获取t方向的导数,同时指定步长0.05 [~, dr1dt] = gradient(r1, 0.05, 0.05); surf(x,t,abs(dr1dt));
修改后再运行,两幅图的振幅就会完全匹配了。
差异总结
简单来说,第一种方法根本没计算你想要的t方向导数,而是错误地用了x方向的梯度做了无意义的缩放,自然和解析导数的振幅对不上。
内容的提问来源于stack exchange,提问作者Aiaz




