分段部件之间的平滑连接

时间:2011-12-17 16:06:55

标签: wolfram-mathematica

分段智能函数示例:

f[x_]:=Piecewise[{{x^2, 0<x<1-epsilon},{x,1<x<2-epsilon},{2,x>2}}]

有没有办法在间隔epsilon中连接这些部件,所以我得到一个平滑的功能?

编辑:
顺便说一下,我并不是说它需要在连接点上是可推导的,只是在一些数字工作中它看起来像一个“自然”的连接。

EDIT2:
两个黑色圆圈代表问题所在的点。我希望它看起来像一个可导出的函数(虽然它不需要严格的数学意义,但我不希望这两个峰值)。红色圆圈代表它看起来很好的部分 picture
我能做的是通过非线性拟合[x-epsilon,x + epsilon]来做到这一点,但我希望有一种更简单的分段函数方法。

3 个答案:

答案 0 :(得分:5)

首先,给定一个函数,我们应该在整个范围{x,0,2}上精确定义它,即。其值范围为1-epsilon <= x < 12 - epsilon <= x < 2enter image description here

最简单的方法是在两个范围上定义f1[x]分段线性,但是结果函数在胶合点上不会是可微分的,而且会涉及尖峰。

为防止出现这种情况,我们应该选择(在这种情况下)至少三阶多项式:

P[x_] := a x^3 + b x^2 + c x + d

并将它们与f[x]粘合在一起,假设“胶合条件”(在给定点及其一阶导数处的函数相等)即。解决结果方程:

W[x_, eps_]:= P[x]//. Flatten@Solve[{#^2 == P[#],
                                     1   == P[1], 
                                     2#  == 3a#^2 +2b# +c, 
                                     1   == 3a +2b +c},   {a, b, c, d}]&@(1-eps)

Z[x_, eps_]:= P[x]//. Flatten@Solve[{#  == P[#],
                                     2  == P[2], 
                                     1  == 3a#^2 +2b# +c, 
                                     0  == 12a +4b +c},  {a, b, c, d}]&@(2-eps)  

为了使结果可视化,我们可以优先考虑Manipulate

f1[x_, eps_]:=  Piecewise[{{x^2, 0 <  x < 1 -eps}, {W[x, eps], 1 -eps <= x < 1},
                           { x , 1 <= x < 2 -eps}, {Z[x, eps], 2 -eps <= x < 2},
                                                   {    2    ,           x >=2}}]; 
Manipulate[ Plot[f1[x, eps],  {x, 0, 2.3}, 
                 PlotRange ->    {0, 2.3}, ImageSize->{650,650}]
                                                        //Quiet, {eps, 0, 1}]

我们会根据epsilon > 0获得可区分的函数f1,而epsilon = 0 f1在两点上无法区分。

Plot[f1[x, eps]/. eps -> .4, {x, 0, 2.3}, PlotRange -> {0, 2.3}, 
                             ImageSize -> {500, 500}, PlotStyle -> {Blue, Thick}]

enter image description here

如果我们希望f1是一个平滑函数(无限可微),我们应该使用超越函数来定义范围f1中的[1 - epsilon <= x < 1),例如Exp[1/(x-1)]等。< / p>

答案 1 :(得分:4)

您可以在定义间隔的开始和结束点的函数之间逐渐更改。下面我通过根据区间中的位置移动这些函数的加权和中的权重来做到这一点:

ClearAll[f]
epsilon = 0.1;
f[x_] :=
 Piecewise[
  {
   {x^2, 0 < x < 1 - epsilon},
   {Rescale[x, {1 - epsilon, 1}, {1, 0}] x^2 + Rescale[x, {1 - epsilon, 1}, {0, 1}] x, 
      1 - epsilon <= x <= 1}, 
   {x, 1 < x < 2 - epsilon},
   {Rescale[x, {2 - epsilon, 2}, {1, 0}] x + Rescale[x, {2 - epsilon, 2}, {0, 1}] 2, 
      2 - epsilon <= x <= 2},
   {2, x > 2}
   }
  ]

Plot[f[x], {x, 0, 2.5}]

enter image description here

答案 2 :(得分:0)

我不确定我理解你的问题,但我从这里收集到的是一个想法

ClearAll[f]
e = 0.1
f[x_] := Piecewise[{{x^2, 0 < x < 1 - e}, {whatEver, 
    1 - e <= x <= 1 + e}, {x, 1 + e < x < 2}, {2, x > 2}}, error]

f[1]给了whatEver。