没有预定义区间的分段函数
Piece wise function without predefined intervals
我想制作一个代表分段函数的 .m 文件,returns 是一个计算了所有离散值的向量。
为了更清楚一点,我想要一个函数(我将其命名为 Iapp 并且是时间相关的,所以 Iapp(t))在前 100 秒内 return 为零然后 returns 0.5 为 100-120s,然后再次为 0 为 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 提供一个标量值,并使函数 return 只是一个标量值。
恐怕我不明白复杂循环的目的,但据我所知,你可以从函数参数中推导出第k个部分向量的长度nk及其值xk .那么为什么不在一开始就这样做并通过类似
的方式创建每个部分向量
iappk = xk*ones(1,nk);
最后将它们连接在一起
Iapp = [iapp1 iapp2 iapp3 iapp4]
希望对你有所帮助
这个函数?
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
我想制作一个代表分段函数的 .m 文件,returns 是一个计算了所有离散值的向量。
为了更清楚一点,我想要一个函数(我将其命名为 Iapp 并且是时间相关的,所以 Iapp(t))在前 100 秒内 return 为零然后 returns 0.5 为 100-120s,然后再次为 0 为 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 提供一个标量值,并使函数 return 只是一个标量值。
恐怕我不明白复杂循环的目的,但据我所知,你可以从函数参数中推导出第k个部分向量的长度nk及其值xk .那么为什么不在一开始就这样做并通过类似
的方式创建每个部分向量iappk = xk*ones(1,nk);
最后将它们连接在一起
Iapp = [iapp1 iapp2 iapp3 iapp4]
希望对你有所帮助
这个函数?
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