【问题标题】:Piece wise function without predefined intervals没有预定义间隔的分段函数
【发布时间】:2018-03-23 20:44:55
【问题描述】:

我想制作一个 .m 文件,它代表一个分段函数并返回一个包含所有离散值计算的向量。

为了更清楚一点,我想要一个函数(我将其命名为 Iapp,并且与时间相关,因此 Iapp(t))在前 100 秒内返回零,然后在 100-120 秒内返回 0.5,然后在 120 秒内返回零-220s 然后 0.5+0.2 持续 220-240s,然后继续。

我知道可以使用逻辑索引定义分段函数,但我的问题是我想要函数的时间间隔没有预定义。所以我不知道逻辑索引是如何工作的……如果时间间隔不是 120 的倍数,它就不起作用。

我尝试了以下方法:

function Vect_Iapp = Iapp_morceaux(tspan, h)
i = 1;
j = 1;
t = tspan(1):h:tspan(2);
while t(i) < tspan(2)         
    while(t(i)< (j*100 + (j-1)*20))
        Iapp(i) = 0;
        i = i + 1;
    end
    while (t(i)>j*100 && t(i) < j*100 + j*20)
        Iapp(i) = 0.5 + j*0.2;
        i = i + 1;
    end
    j = j + 1;
end    
Vect_Iapp = Iapp;
end

但算法并不总是像它应该的那样工作。关于如何定义此功能的任何想法? 请注意,我还希望能够以某种方式为 tspan 提供一个标量值,并使函数只返回一个标量值。

【问题讨论】:

  • 对我来说还不清楚该函数应该做什么(你说它目前没有)。 tspan 通常是双分量的吗?
  • 是的 tspan = [Initial_time Final_time]。例如如果 tspan = [0 240] 那么它应该是 Iapp(0-100) = 0, Iapp(101 - 120) = 0.5, Iapp(121 - 220) = 0, Iapp(220 - 240) = 0.7跨度>
  • 如果 tspan = [17 241] ?
  • 按照我的推理,它应该是 Iapp(17 - 117) = 0, Iapp(117 - 137) = 0.5, Iapp(137-141) = 0...。但在我的应用程序中,区间总是从 0 开始,这就是我编写这样的算法的原因。我想我可以在条件中添加“+tspan(1)”,它会是一样的。

标签: algorithm matlab vector piecewise


【解决方案1】:

恐怕我没有得到卷积循环的目的,但据我所知,您可以从函数参数中推断出第 k 个部分向量的长度 nk 及其值 xk 。那为什么不一开始就这样做,然后通过类似的方式创建每个部分向量

iappk = xk*ones(1,nk);

最后将它们连接在一起

Iapp = [iapp1 iapp2 iapp3 iapp4]

希望对你有帮助。

【讨论】:

    【解决方案2】:

    这个函数?

    x=linspace(0,600,1000);
    y=Iapp(x);
    plot(x,y)
    
    function y=Iapp(t)
        r=mod(t,120);
        c=floor(t/120);
        VAL1=0;
        VAL2=0.5 + 0.2*c;
        y=VAL1.*(r<=100) + VAL2.*(r>100);
    end
    

    【讨论】:

    • 它完全符合我的要求。但我只能使用 linspace 让它工作。当我尝试使用标量值或其他向量时,我没有得到我应该得到的结果。你能解释一下吗?编辑:原来我只是做了一些愚蠢的事情,它工作得很好,我现在明白了,谢谢。
    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    相关资源
    最近更新 更多