You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MATLAB中两种求导绘图方法的结果为何不一致?

为什么两种MATLAB求导绘图的振幅不一致?

这个问题的核心是你对MATLAB gradient函数的用法理解有误,咱们一步步拆解问题根源:

第一种方法的两个关键错误

你第一种方法的代码里,求导逻辑完全偏离了目标,导致结果和解析导数对不上:

  1. 拿错了梯度方向
    MATLAB的gradient函数处理二维数组时,会返回两个输出:[dx_grad, dt_grad],其中第一个是x方向的梯度,第二个才是t方向的梯度。但你只写了dr1=gradient(r1);,这时候dr1只保存了x方向的梯度,完全没拿到你需要的t方向导数——这是最致命的错误!
  2. 导数缩放逻辑错误
    就算你拿到了正确的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

火山引擎 最新活动