【问题标题】:Matlab - how to draw tangent on curveMatlab - 如何在曲线上绘制切线
【发布时间】:2016-04-03 17:04:41
【问题描述】:

我在 matlab 中绘制了一个图形:

plot(x,y)

我的图表有不同的斜率,我如何在每个斜率上绘制切线并计算斜率的系数?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    如果您没有绘制点的显式函数,您可以使用finite differences 来估计导数。以下适用于不在数据跨度边界上的点:

    plot(x,y);
    hold all;
    
    % first sort the points, so x is monotonically rising
    [x, sortidx] = sort(x);
    y = y(sortidx);
    
    % this is the x point for which you want to compute the slope
    xslope = (x(1)+x(end))/2;
    
    idx_a = find(x<xslope,1,'last');
    idx_b = find(x>xslope,1,'first');
    % or even simpler:
    idx_b = idx_a+1;
    % this assumes min(x)<xslope<max(x)
    
    xa = x(idx_a);
    xb = x(idx_b);
    slope = (y(idx_b) - y(idx_a))/(xb - xa);
    

    现在画那个斜率,这取决于你想要什么:只是一条短线:

    yslope = interp1(x,y,xslope);
    ya_sloped = yslope + (xa-xslope)*slope;
    yb_sloped = yslope + (xb-xslope)*slope;
    line([xa;xb],[ya_sloped;yb_sloped]);
    

    或更长的线

    yslope = interp1(x,y,xslope);
    xa = xa + 4*(xa-xslope);
    xb = xb + 4*(xb-xslope);
    ya_sloped = yslope + (xa-xslope)*slope;
    yb_sloped = yslope + (xb-xslope)*slope;
    line([xa;xb],[ya_sloped;yb_sloped]);
    

    我很确定这段代码中没有错误,但是当我有 matlab 时我会对其进行测试;)

    【讨论】:

      【解决方案2】:

      您必须在您有兴趣使用 (y2-y1)/(x2-x1) 的任何点处计算出斜率,然后使用 plot() 绘制一条具有该斜率的直线。要绘制直线,您需要 y 截距,并且由于您知道该直线上至少一个点的坐标(这是您要绘制切线的点),您可以在方程 y=mx 中求解 b +b。

      【讨论】:

      • 我将这个答案重新设置为 0。这不是最佳答案,也没有深入了解 matlab 代码,但它在概念上是合理的,所以我认为它不值得 -1
      • 我同意这种方法,但我会补充一点,根据图表的水平分辨率(必须绘制多少点),您可能需要考虑先进行插值以获得更准确的结果。见matlab中的interp(),很简单。