为什么这段代码的错误信息会返回:“下标索引必须是真正的正整数或逻辑。”,当我为每个下标使用ceil时?
A=1:1:100;
B=1:1:100;
C=1;
D=1:1:100;
E=2;
F=1:1:100;
G=1:1:100;
H=0.1:0.1:10;
fun_1=@(t)integral(@(ti)G(ceil(ti)).*H(ceil(t-ti)),0.1,t-1);
fun_2=@(t)integral(@(ti)G(ceil(ti)).*B(ceil(ti)).*(C.*D(t).^E)./F(t).*...
exp(-integral(@(x)(C.*D(ceil(x)).^E)./F(ceil(x)),ti,5)-K.*(t-ti)),0.1,t-
1,'ArrayValued',true);
I=500;
J=1000;
K=2;
fun_3=@(t)I*integral(@(ti)min(fun_2(ceil(ti)),J).*exp(-(K+I).*(t-ti)),0.1,t-
1);
t=1:1:5;
figure(1)
fplot(fun_1,t);
figure(2)
fplot(fun_2,t);
figure(3)
fplot(fun_3,t);
答案 0 :(得分:0)
fplot see documentation在fplot(f,xinterval)
区间内调用f
评估函数句柄xinterval
。 IT部门将根据给定时间间隔自动确定的步骤评估f
。
来自文档:
xinterval - x [-5 5]的间隔(默认值)|双元素向量 表格[xmin xmax]
您似乎试图准确指定您希望评估函数的位置
t=1:1:5;
...
fplot(fun_1,t);
但它并没有这样做。发生的事情是fplot
正在评估函数从1到2(t
的前2个元素)。例如,它可能会将t = 1,1.05,1.1,...,2的值输入到fun_#函数中。
你可以告诉这个,因为你的第一个功能实际上可以在1到2的x范围内进行绘制。
你得到下标索引错误的原因是因为在fun_2中你有这个...(C.*D(t).^E)./F(t).*...
因为fplot正在输入t的值,这些值间隔在1到2之间(例如1.1),这不是一个有效的索引。
如果你真的只想要函数的值t = 1:1:5
你可能不想使用fplot,只想在那些时候评估函数并绘制它。
y = feval(fun_1,t);
plot(t,y)
编辑:上述代码无效
您需要执行以下代码之类的操作。这是因为第二个& the intergral function的第3个星座需要是标量(1x1)。如果你为它们提供一个数组,那么它们会崩溃。因此,不要同时评估每个t
。
figure(1)
y_1 = arrayfun(fun_1,t);
plot(t,y_1);
figure(2)
y_2 = arrayfun(fun_2,t);
plot(t,y_2);
figure(3)
y_3 = arrayfun(fun_3,t);
plot(t,y_3);
注意:第三个功能仍然存在错误......我并非100%确定原因。我没有真正看过它。