matlab 积分内联函数,如何在MATLAB中创建分段内联函数?

你确实定义了一个带有三个断点的分段函数,即[0,0.5,1].但是,您尚未在中断之外定义函数的值. (顺便说一下,我在这里使用了“break”这个术语,因为我们确实定义了一个简单形式的样条,一个分段常数样条.我也可能使用了术语knot,这是splines世界中的另一个常用词. )

如果你绝对知道你永远不会评估[0,1]之外的函数,那么就没有问题了.因此,只需在x = 0.5时定义一个断点的分段函数.定义像你这样的分段常量函数的简单方法是使用逻辑运算符.因此,测试(x> 0.5)返回常数,0或1.通过缩放和转换该结果,可以容易地生成满足您期望的功能.

constfun = @(x) (x > 0.5)*2 - 1;

内联函数执行类似的操作,但与匿名函数相比,内联函数非常慢.我强烈建议使用匿名表格.作为测试,试试这个:

infun = inline('(x > 0.5)*2 - 1','x');

x = 0:.001:1;

tic,y = constfun(x);toc

Elapsed time is 0.002192 seconds.

tic,y = infun(x);toc

Elapsed time is 0.136311 seconds.

是的,内联函数比匿名表单花了更多的时间来执行.

我在这里使用的简单分段常数形式的一个问题是当你有更多的断点时很难扩展.例如,假设您希望定义一个函数,该函数具有三个不同的值,具体取决于该点落入的时间间隔?虽然这可以通过创造性地使用测试,小心地移动和缩放它们来完成,但它可能会变得令人讨厌.例如,如何定义返回的分段函数

-1 when x < 0,

2 when 0 <= x < 1,

1 when 1 <= x

一种解决方案是使用单元Heaviside功能.首先,定义一个基本单位Heaviside函数.

H = @(x) (x >= 0);

我们的分段函数现在来自H(x).

P = @(x) -1 + H(x)*3 + H(x-1)*(-1);

看到P(x)有三个部分.第一个术语是第一个断点以下x发生的情况.然后我们添加一个在零以上生效的片段.最后,第三部分在x == 1之上增加了另一个偏移.很容易绘制.

ezplot(P,[-3,3])

从这个开始就可以轻松生成更复杂的样条.我称之为construct再次构造一个样条曲线.真的,这是我们可能领导的地方.事实上,这就是领先的地方.样条曲线是一种分段函数,在结点或断点列表中小心地绑在一起.特别是样条曲线通常具有指定的连续性顺序,因此,例如,三次样条曲线在断点处将是两次可微分(C2).还有分段三次函数,它们只是C1函数.我在所有这一点上的观点是我描述了一个简单的起点,形成任何分段函数.它对多项式样条函数很有效,尽管选择这些函数的系数可能需要一点点数学.

创建此函数的另一种方法是显式分段多项式.在MATLAB中,我们有一个鲜为人知的函数mkpp.试试这个……

pp = mkpp([0 .5 1],[1;-1]);

如果你是splines工具箱,那么fnplt会直接为你绘制这个.假设您没有TB,请执行以下操作:

ppfun = @(x) ppval(pp,x);

ezplot(ppfun,[0 1])

回顾一下mkpp的调用,毕竟它很简单.第一个参数是曲线中的断点列表(作为ROW向量).第二个参数是一个COLUMN向量,曲线将在断点之间的这两个定义的间隔中采用分段常量值.

几年前我发布了另一个选项,piecewise_eval.它可以从MATLAB Central文件交换中下载.这是一个允许用户将分段函数纯粹指定为断点列表以及这些断点之间的功能块的函数.因此,对于在x = 0.5处具有单个中断的函数,我们将执行此操作:

fun = @(x) piecewise_eval(x,0.5,{1,-1});

看到第三个参数提供了每个段中使用的值,尽管这些段不必是纯粹的常量函数.如果你希望函数在感兴趣的区间之外返回一个NaN,那么这也很容易实现.

fun = @(x) piecewise_eval(x,[0 0.5 1],{NaN,1,-1,NaN});

我在所有这些相当冗长的偏移中的观点是理解分段函数是什么,以及在MATLAB中构建一个函数的几种方法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值