2016-01-25 194 views
0

我正在嘗試使用MATLAB integral()函數來集成代表時變值的分段線性函數的單個參數。使用MATLAB積分和匿名函數

我想定義在原有基礎上功能的匿名函數:

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

a0 = 1; 
a1 = 2; 

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

這裏是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 

的問題是,當我行使下列腳本:

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) 

我得到以下堆棧跟蹤:

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')); 

我在Windows 7

回答

5

運行MATLAB 2015B的問題是integral使用量化參數爲你的功能,但你的功能不支持它。

相關部分從文檔:

對於標量值的問題,函數y =樂趣(X)必須接受的載體的參數,x和返回向量結果,Y。這通常意味着樂趣必須使用數組運算符而不是矩陣運算符。例如,使用。*(times)而不是*(mtimes)。如果將'ArrayValued'選項設置爲true,則fun必須接受標量並返回固定大小的數組。

Reference

這意味着整體會調用你的函數f與參數,像f([1,2,3]),願與[f(1),f(2),f(3)]

列表中的通用技術to vectorize a piecewise defined function are explained in this question

+1

噢,打我吧:(這應該也可以將'ArrayValued'設置爲true:那麼函數只能用標量參數調用,那麼你不需要矢量化(但你應該;這會更快) –

+2

@AndrasDeak:我認爲這個選項是用於返回向量的函數,我沒有在這裏使用conciser。我的matlab版本是老的有這個選擇,如果它真的解決了它,請寫一個答案。 – Daniel

+1

將'ArrayValued'設置爲'true'訣竅,謝謝!我讀過,並認爲這只是函數返回數組值,所以我的壞! – gariepy