【问题标题】:Result of atan2 is not smoothatan2 的结果不平滑
【发布时间】:2019-01-29 17:22:16
【问题描述】:

我正在使用atan2(在 MATLAB 中)计算角度,然后取角度的梯度。我可以看到在 pi 和 pi/2 这样的地方角度不平滑,但这在图中不可见。然后,绘制角度的梯度会显示大的负尖峰。我可以通过设置绘图的限制 (ylim) 来忽略这些,但这不是一个好的通用解决方案。 我可以以某种方式避免平滑度问题,或者在计算后平滑角度吗?

这里有更多的背景。我正在使用数值 ODE 求解器(特别是 SUNDIALS CVODE)来计算二维情况下的行星轨道,因此结果是两个与时间相关的向量,我们称它们为 xy。然后atan2 给了我角度,角度的梯度给了我角速度。我尝试了 MATLAB smoothdata,但它并没有解决手头的问题。

代码只是MATLABatan2gradient,除了轨道的计算,但这应该与这个问题无关。

我需要消除角速度中的负尖峰。

【问题讨论】:

  • 你能告诉我们一些代码和你的情节吗?没有具体的例子很难理解(见minimal reproducible example)。另请注意,atan2 返回的值介于 -pipi 之间。您是否正在寻找unwrap
  • 确实,尖峰出现在角度从 -pi 翻转到 pi 的位置吗?您应该绘制角度来验证这一点。如果不是这种情况,请发布代码并上传您的情节,以便我们查看!

标签: matlab gradient smoothing atan2


【解决方案1】:

如果您知道您的角度梯度幅度应该始终小于 pi(或 pi 和两个 pi 之间的某个其他阈值),那么您可以修复梯度 grad,如下所示:

if grad < pi
    grad = grad + 2 * pi;
elseif grad > pi
    grad = grad - 2 * pi;
end

如果你没有这样的保证,那么你需要假设梯度变化是平滑的,这需要更复杂的校正。

【讨论】:

  • 非常感谢所有回复的人。我将在此注释中添加一些数据、图表和代码。请注意,t 是时间向量,q1 和 q2 是笛卡尔坐标。 Theta1 是角度,theta1Dot 是角速度。
  • 代码:fh = figure();坚持,稍等; theta1 = atan2(q2,q1); % theta2 = 平滑数据(theta1); theta1Dot = 梯度(theta1,t(end)/length(t)); % theta1DotD = diff(theta1)*length(t)/t(end); % theta2Dot = 平滑数据(theta1Dot); yyaxis('左');斧头 = gca; ax.YColor='r';情节(t,theta1,'r-'); ylim([-pi,pi]); ylabel('\th​​eta','颜色','r'); yyaxis('right');
  • ax = gca; ax.YColor='b';情节(t,theta1Dot,'b-'); ylim([18.5,19]); % f01 的特殊情况 ylabel('\th​​etaDot','Color','b');网格('开');网格(“次要”); xlabel('t'); % legend('\th​​eta','位置','最佳'); % legend('\th​​eta','\dot{\theta}','位置','最佳'); legend('\th​​eta','\thetadot','位置','最佳');标题(strrep(nameOrbit,'.txt','Data2'));
  • nameFig = strrep(nameOrbit,'.txt','Data2'); nameFig = [DataDir, '\', nameFig]; savefig(fh,nameFig); saveas(fh,nameFig,'jpeg');关闭(fh);
  • 我很想把所有数据和所有代码都附上,但是数据太大,代码需要拆分,界面丢失了新行。我正在努力学习 Stack Overflow 的基础知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 2016-03-19
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2011-12-17
相关资源
最近更新 更多