加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MATLAB中符号分段函数的实现

(2014-06-12 21:26:59)
标签:

it

教育

分类: MATLAB

       本人是MATLAB新手,最近想在MATLAB中建立一个符号分段函数,然后进行符号运算,然而经过多番尝试发现这不是一个简单的事情,于是果断百度之。百度的结果却令我十分的失望,大家似乎都没有解决这个问题,于是狠下心来,琢磨了一个下午,在参透了符号运算之后,终于找到了法子,下面简单的说说:

       随便找一个简单的分段函数:

http://s7/mw690/002BQeUSgy6JCHjUGBoc6&690
http://s2/bmiddle/002BQeUSgy6JCHGvMpX51&690


有人会说这很简单啊,一个简单的if else结构就完成了见下图:

http://s12/mw690/002BQeUSgy6JCHLYkWf1b&690

那么首先,这个函数本身就有问题,先不讨论是数值运算还是符号运算的问题。

如果函数输入一个数值,那没有问题,函数输出是正确的。问题是如果函数输入的是一个数组,例如x=-1:0.1:3,那么函数内部if进行判断的结果是进入else分支,输出的结果是0,这显然不对。

改进的方法是采用以下公式

http://s9/mw690/002BQeUSgy6JCHPlCqc18&690

这样输入x不管是单个数值还是数组向量,输出结果都是正确的。注意数组输入时x<0的结果仍是一个数组,由1,0组成。

 

前面的讨论是基于数值计算的,然而对于符号计算则又是另外一回事了。采用前述的第二种方式建立的函数,是不能进行符号运算的。符号运算与数值运算的区别在于,数值运算的对象是数值,而符号运算的对象是符号,可以认为是字符串,而符号之间是不可以进行大小比较的,只能是相等或不相等。

    解决的办法是采用单位阶跃函数,MATLAB中单位阶跃函数为y=heaviside(x)定义如下

http://s14/bmiddle/002BQeUSgy6JCHUYynP8d&690

则分段函数表示如下:

y1=heaviside(t)-heaviside(t-1)

然后再将y1转换成符号即可即:

                  y=sym(y1)

哈哈,至此问题就解决了,怎么样上面的方法不错吧,如果你是这么认为的,那你就错了。注意,单位阶跃函数的定义中t=0时函数值为1/2。可以证明对应连续的分段函数,上面的方法是毫无问题的,但是对于不连续的分段函数,上述方法在不连续点是不正确的,至于为什么不正确,大家自己带值进行计算就知道了。

那么出现这种问题该怎么办呢,作为一个屌丝新手,对MATLAB中的各种函数又不熟悉,我只能死磕了,终于让我找到了解决的办法。

其实关键点在不连续点,那么我们先不管不连续点,其他点都是满足的。再考虑不连续点,计算按照上述方法在不连续点的输出分别为t=0,y=1/2t=1,y=1/2,而我们所需要的输出是t=0,y=1t=1,y=0,所以只要在t=0时给输出加上一个1/2,在t=1时给输出加上一个-1/2。那么如何加上这些值呢,我们首先想到单位脉冲函数dirac函数,但是这个破脉冲函数在脉冲处为无穷大,还是不行,那我只好自己创建一个在t=0时输出为1,在t=其他时输出为0的类dirac函数,我们命名为dirac_1

dirac_1这个函数的建立也是一个难点,考虑heaviside(t)函数,我发现,两个heaviside(t)函数相乘恰好有dirac_1函数的性质,即

dirac_1= heaviside(-t)* heaviside(t)*4

 

至此所有问题就都解决了,最终分段函数如下:http://s11/mw690/002BQeUSgy6JCHZYNqGca&690

说实话这个过程比较复杂,但是网上又没有找到其他方法,所以在此发出来大家分享一下,前面也说了,我是一个新手,所以有很多其他的函数什么的都不知道,大神有什么其他简单的方法希望能够拿出来指点指点。。。





0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有