积分的积分

时间:2017-10-18 13:22:37

标签: matlab

为什么这段代码的错误信息会返回:“下标索引必须是真正的正整数或逻辑。”,当我为每个下标使用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);

1 个答案:

答案 0 :(得分:0)

fplot see documentationfplot(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%确定原因。我没有真正看过它。