示例函數:
分段函數f(x)的段數為數組a的長度減1,在表達f(x)時,不能直接使用a的長度5-1=4.
方法1:
先計算每個間隔點的函數值f(a2),f(a3),f(a4),再循環表示f(x)。
f(x) = (2x+1).*(x>2&&x<=4)
+(f(4)+2x^2+2).*(x>4&&x<=6)
+(f(6)+2x^3+3).*(x>6&&x<=8)
+(f(8)+2x^4+4).*(x>8&&x<=10)
因為每段中的表達式有一定的規律,所以可以用循環進行表示。
代碼如下:
function y =f(x)
y = 0;
a = [2 4 6 8 10];
% gap vector is used to store f(a1),f(a2),...,f(a5)
gap = zeros(size(a));
for i = 2:length(a)
gap(i) = 2*(a(i)^(i-1))+(i-1);
end
for i = 2:length(a)
gap(i) = gap(i) + gap(i - 1);
end
% The representation of piecewise function
for i = 1:length(a)-1
y = y + (gap(i) + 2*(x^i)+i).*(x>a(i)&&x<=a(i+1));
end
方法2:
同方法1,先計算間隔點函數值f(a2),f(a3),f(a4),再使用插值函數判斷輸入的自變量x位於哪個區間,進而使用該區間上的表達式。
代碼如下:
function y = f(x)
a = [2 4 6 8 10];
% 計算每個區間的基數f(a2),f(a3),f(a4)
gap=zeros(size(a));
gap(1)=0;gap(end)=nan;
for i=2:length(a)-1
gap(i)=gap(i-1)+2*a(i)^(i-1)+(i-1);
end
%使用插值函數計算x落在哪個區間上,num表示段數。
num=interp1(a,1:length(a),x);
num=ceil(num)-1;
num(isnan(num))=length(a); %處理超過數組a范圍的值
num(num==0)=1; %處理第一個x = a(1)
%計算函數值,每個分段上的基數加上該分段上的變量
y=gap(num)+2*x.^num+num;
方法3:
同方法2,但不使用插值函數,使用Find函數判斷輸入的自變量x位於哪個區間
代碼如下:
function y = f(x)
a = [2 4 6 8 10];
% 計算每個區間的基數f(a2),f(a3),f(a4)
gap=zeros(size(a));
gap(1)=0;gap(end)=nan;
for i=2:length(a)-1
gap(i)=gap(i-1)+2*a(i)^(i-1)+(i-1);
end
%使用find函數計算x落在哪個區間上,num表示段數。
num=find(sort([a x]) == x);
num=num(1)-1; % 當a中某元素與x相同時,取第一個。
num(isnan(num))=length(a); %處理超過數組a范圍的值
num(num==0)=1; %處理第一個x = a(1)
%計算函數值,每個分段上的基數加上該分段上的變量
y=gap(num)+2*x.^num+num;
參考資料:

