使用matlab表示“段数不确定”的分段函数

示例函数:

分段函数f(x)的段数为数组a的长度,在表达f(x)时,不能直接使用a的长度5.

方法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;  
时间: 2024-08-10 13:07:44

使用matlab表示“段数不确定”的分段函数的相关文章

【不可能的任务3/200】bzoj2243树链剖分+染色段数

终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开线段树的时候记录一下就好了 事实上我开了一个node,并且写了一个mix还是大大减小了代码量(对于我这种手残党来说同时大大减小了错误率) 由于前几题做的都是树链剖分,并没有在这一方面出问题,然而线段树还是不熟练,刚写完的时候居然忘记down了(mdzz) 对wa了N遍的总结: 由于是树上两个点间的路

ZOJ 1610——Count the Colors——————【线段树区间替换、求不同颜色区间段数】

Count the Colors Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 1610 Description Painting some colored segments on a line, some previously painted segments may be covered by some the subsequent o

HYSBZ - 2243 树链剖分 + 线段树 处理树上颜色段数

用线段树处理颜色段数 记录区间内的颜色段数,区间右端点的颜色,区间右端点的颜色. int tr[maxn<<2], lc[maxn<<2], rc[maxn<<2]; 懒标记,记录区间是否被覆盖 int lazy[maxn<<2]; 合并的方法是这样,对于某一区间 ? 如果 左区间的右端点颜色 == 右区间的左端点 ? 那么 这左右区间合并,左区间的最右边一段和右区间最左边一段颜色是连续的,那么区间的颜色段数为 左区间颜色段数+右区间颜色段数 - 1. ?

C++统计代码注释行数 &amp; 有效代码行数 &amp; 代码注释公共行 &amp; 函数个数

问题来源,在14年的暑假的一次小项目当中遇到了一个这样的问题,要求统计C++代码的注释行数,有效代码行数,代码注释公共行数,以及函数个数. 下面稍微解释一下问题, 1)注释行数:指有注释的行,包括有代码和注释的公共行(如:3,4,15,22...) 2)有效代码行:指有代码的行,包括有代码和注释的公共行(如:1,4,11,15,25....) 3)代码注释公共行:指又有代码又有注释的行(如:4,15...) 4)函数个数:这个不用说明了吧. 以下为注释情况展示代码: 1 #include <st

如果两段内存重叠,用memcpy函数可能会导致行为未定义

如果两段内存重叠,用memcpy函数可能会导致行为未定义,改进: void* memmove(void* str1,const void* str2,size_t n) { char* pStr1= (char*) str1; const char* pStr2=(const char*)str2; if (pStr1 < pStr2 ) { for(size_t i=0;i!=n;++i) { *(pStr1++)=*(pStr2++); } } else { pStr1+=n-1; pStr

求区间段数问题-贪心思想

Problem Description(hdu2037,水题) "今年暑假不AC?""是的.""那你干什么呢?""看世界杯呀,笨蛋!""@#$%^&*%..."确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了.作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事).非常6+7.超级女生,以

(原创)c#学习笔记06--函数01--定义和使用函数02--参数

6.1.2  参数 当函数接受参数时,就必须指定下述内容: 函数在其定义中指定要接受的参数列表,以及这些参数的类型. 在每个函数调用中匹配的参数列表. 这涉及到下述代码: static <returnType> <FunctionName>(<paramType> <paramName>, ...) { ... return <returnValue>; } 其中可以有任意多个参数,每个参数都有一个类型和一个名称.参数用逗号分隔开.每个参数都在函

【转帖】MATLAB中产生高斯白噪声的两个函数

MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声. 1. WGN:产生高斯白噪声 y = wgn(m,n,p) 产生一个m行n列的高斯白噪声的矩阵,p以dBW为单位指定输出噪声的强度. y = wgn(m,n,p,imp) 以欧姆(Ohm)为单位指定负载阻抗. y = wgn(m,n,p,imp,state) 重置RANDN的状态. 在数值变量后还可附加一些标志性参数: y = wgn(

求数组的最小数、最大值,求一组数的平均数,sort函数详解,类数组转数组

求数组的最小值和最大值 1 //求数组当中最大值和最小值 2 var arr=[3,2,6,1,45,23,456,23,2,6,3,45,37,89,30]; 3 //第一种方法 根据排序方法来求最大值和最小值 从小到大排序 第0位就是最小值 最后一位就是最大值 4 arr.sort(function(a,b){ 5 return a-b; //按从小大的情况排序 6 //return b-a; 按从大到小的情况排序 7 }) 8 console.log(arr); 9 var min=arr