使用MATLAB与匿名函数集成

gar*_*epy 0 math matlab

我正在尝试使用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.

Dan*_*iel 5

问题是integral为您的函数使用矢量化参数,但您的函数不支持它.

文件中的相关部分:

对于标量值问题,函数y = fun(x)必须接受向量参数x,并返回向量结果y.这通常意味着fun必须使用数组运算符而不是矩阵运算符.例如,使用.*(次)而不是*(mtimes).如果将"ArrayValued"选项设置为true,则fun必须接受标量并返回固定大小的数组.

参考

这意味着,将f使用类似的参数调用函数,f([1,2,3])并期望使用列表[f(1),f(2),f(3)]

在这个问题中解释了矢量化分段定义函数的一般技术

  • @AndrasDeak:我认为这个选项适用于返回向量的函数,我没有在这里使用它.我的matlab版本是老有这个选项,如果它真的解决了它,请写一个答案. (2认同)