使用MATLAB与匿名函数集成

时间:2016-01-25 23:26:45

标签: matlab math

我正在尝试使用MATLAB 3 + 4.44e-16函数来整合表示时变值的分段线性函数的单个参数。

我想基于原始函数定义一个匿名函数:

integral()

这是accel_profile.m:

t1 = 1;
t2 = 2;
t3 = 4;
t4 = 5;

a0 = 1;
a1 = 2;

f = @(x) accel_profile(t1,t2,t3,t4,a0,a1,x);

问题在于,当我运用以下脚本时:

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

我得到以下堆栈跟踪:

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)

我在Windows 7上运行MATLAB 2015b。

1 个答案:

答案 0 :(得分:5)

问题是f为你的函数使用了矢量化参数,但你的函数不支持它。

文件中的相关部分:

  

对于标量值问题,函数y = fun(x)必须接受向量参数x,并返回向量结果y。这通常意味着fun必须使用数组运算符而不是矩阵运算符。例如,使用。*(次)而不是*(mtimes)。如果你设置了'ArrayValued&#39;选项为true,那么fun必须接受一个标量并返回一个固定大小的数组。

Reference

这意味着,积分会使用f([1,2,3])之类的参数调用您的函数[f(1),f(2),f(3)],并期望列表中包含@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET "sourcedir=U:\sourcedir" SET "filename1=%sourcedir%\q35002863.txt" FOR /f "usebackqtokens=1-7*delims=^|" %%a IN ("%filename1%") DO ( SET "C8=%%h" ECHO(%%a,%%b,%%c,%%d,%%e,%%f,"%%g",!C8:^|=,! ) GOTO :EOF

一般技巧to vectorize a piecewise defined function are explained in this question