Плавное соединение между кусочными частями - PullRequest
7 голосов
/ 17 декабря 2011

Пример кусочно-мудрой функции:

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 ]

5 голосов
/ 17 декабря 2011

Сначала, для данной функции мы должны точно определить ее во всем диапазоне {x,0,2}, т.е.его значения в диапазонах 1-epsilon <= x < 1 и 2 - epsilon <= x < 2.enter 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)] и т. Д.

4 голосов
/ 17 декабря 2011

Вы можете постепенно менять функции, определяющие начальную и конечную точки интервала.Ниже я делаю это путем смещения веса во взвешенной сумме этих функций в зависимости от положения в интервале:

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

0 голосов
/ 17 декабря 2011

Я не уверен, что понимаю ваш вопрос, но из того, что я понял, есть идея

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] дает что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...