我正在尝试使用MATLAB integral()函数来集成表示时变值的分段线性函数的单个参数.
我想基于原始函数定义一个匿名函数:
t1 = 1;
t2 = 2;
t3 = 4;
t4 = 5;
a0 = 1;
a1 = 2;
f = @(x) accel_profile(t1,t2,t3,t4,a0,a1,x);
Run Code Online (Sandbox Code Playgroud)
这是accel_profile.m:
function value = accel_profile(t1,t2,t3,t4,a0,a1, t)
if t <= t1
value = a0;
return
elseif (t <= t2)
value = ((t-t1)/(t2-t1)) * (a1-a0) + a0;
return
elseif (t <= t3)
value = a1;
return
elseif (t <= t4)
value = ((t-t3)/(t4-t3)) * (a0-a1) + a1;
return
else
value = a0;
return
end
Run Code Online (Sandbox Code Playgroud)
问题是当我运用以下脚本时:
t_list = 0:0.1:6;
q = zeros(1,length(t_list))
for i = 1:length(t_list)
q(i) = integral(f,0,t_list(i));
end
plot(t_list, q)
Run Code Online (Sandbox Code Playgroud)
我得到以下堆栈跟踪:
Error using integralCalc/finalInputChecks (line 515)
Output of the function must be the same size as the input. If FUN is an array-valued integrand, set
the 'ArrayValued' option to true.
Error in integralCalc/iterateScalarValued (line 315)
finalInputChecks(x,fx);
Error in integralCalc/vadapt (line 132)
[q,errbnd] = iterateScalarValued(u,tinterval,pathlen);
Error in integralCalc (line 75)
[q,errbnd] = vadapt(@AtoBInvTransform,interval);
Error in integral (line 88)
Q = integralCalc(fun,a,b,opstruct);
515 error(message('MATLAB:integral:FxNotSameSizeAsX'));
Run Code Online (Sandbox Code Playgroud)
我在Windows 7上运行MATLAB 2015b.
问题是integral为您的函数使用矢量化参数,但您的函数不支持它.
文件中的相关部分:
对于标量值问题,函数y = fun(x)必须接受向量参数x,并返回向量结果y.这通常意味着fun必须使用数组运算符而不是矩阵运算符.例如,使用.*(次)而不是*(mtimes).如果将"ArrayValued"选项设置为true,则fun必须接受标量并返回固定大小的数组.
这意味着,将f使用类似的参数调用函数,f([1,2,3])并期望使用列表[f(1),f(2),f(3)]
在这个问题中解释了矢量化分段定义函数的一般技术
| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |