【问题标题】:Plotting "saw-tooth like" functions on MATLAB在 MATLAB 上绘制“锯齿状”函数
【发布时间】:2017-03-20 23:27:14
【问题描述】:

我正在尝试在单个图上绘制分段函数(形式为 y = αx + β),这样对于 x 轴上的不同区域,我有不同的 α 和 β 值功能。

我想让这些步骤的位置(在 x 轴上)可以随意修改,而不是具有预定数量的此类分段功能。绘制时,理想情况下,它应该看起来像一组不同斜率和截距的线,每条线都由一个间距隔开。因此,如果我的间距向量有 10 个元素,我编写的代码将相应地为 x 轴上的不同区域提供 10 个不同的片段函数。

这是我写的代码。

x = linspace(0,100,10000);
y = zeros(1,10000);
spacing = 0:10:100;

alpha = linspace(1,3,length(spacing)); %setting arbitrary upper lim
beta = linspace(1,5,length(spacing));




for j = 1:length(spacing)
    for i=1:10000
        if x(i) <= spacing(j)
            y(i) = alpha(j)*x(i) + beta(j);
            i = i + 1;
        else
            j = j + 1;


        end  
    end



end

plot(x,y)

但是,当我绘制这个时,我得到一个斜率。由于 else 语句中的 j = j + 1 迭代器,它似乎没有识别出间距(j)的变化

任何关于我应该如何解决这个问题的建议或帮助将不胜感激!

【问题讨论】:

    标签: matlab plot piecewise


    【解决方案1】:

    您应该首先遍历x,然后遍历spacing。因为对于x 中的每个元素,您都在尝试找到正确的间隔。然后,一旦您找到该间隔,您应该移动到x 的下一个元素并停止对spacing 的迭代。您可以使用brake 做到这一点。如果您不这样做,那么它将始终选择最后一个间隔,since x(i) &lt;= spacing(end)。请看下面的代码:

    x = linspace(0,100,10000);
    y = zeros(1,10000);
    spacing = 0:10:100;
    
    alpha = linspace(1,3,length(spacing)); %setting arbitrary upper lim
    beta = linspace(1,5,length(spacing));
    
    for i=1:10000
        for j = 1:length(spacing)
            if x(i) <= spacing(j)
                y(i) = alpha(j)*x(i) + beta(j);
                break
            end  
        end    
    end
    
    plot(x,y)
    ylim([0 max(y)])
    

    最后一行是设置y从0开始。

    【讨论】:

    • 谢谢,这是有道理的。我也很好奇是否有可能让线性图从 y = 0 开始,而不是从前一个函数停止的地方开始。我考虑过在更新 y(i) 后将循环中的 'i' 值重置为 1,但这不会解决如何仍然让 x 轴像往常一样读取 0-100 的问题。
    • 您可以在代码末尾添加 ylim([0 max(y)]) 。更一般地说,ylim([a b]) 将限制 a
    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2014-12-05
    相关资源
    最近更新 更多