Função Smooth Boxcar (função Retângulo Pulso)

Nov 04 2020

Existem algumas respostas sobre como obter uma função de onda quadrada suave. Mas eu gostaria de ter uma função de vagão suave ou função de retângulo com 2 larguras diferentes: wupewdown

Uma solução é a transformada de Fourier, mas prefiro ter uma aproximação com um fator de suavidade.

Muito obrigado.

Aqui está a versão não suave. Eu gostaria de alisá-lo. Observe que: esta não é uma função de onda quadrada (a versão suave é a solução conhecida . Esta é a função de vagão fechado com 2 larguras: a largura para cima é 2 e a largura para baixo é 3.

pulse[h_, wup_, wdown_, t_] := 
 With[{period = wup + wdown, duty = wup/(wup + wdown)}, 
  h*UnitBox[Mod[t/period, 1.]/(2. duty)]]
Plot[{pulse[1, 2, 3, t]}, {t, 0, 10}, Exclusions -> None]

Pulso de onda quadrada com largura uniforme:

Posso fazer uma versão suave apenas para uma função de onda quadrada, com uma largura uniforme, mas não para a função de retângulo.

smoothPulse[ePulse_, wup_, wdown_, smoothness_, t_] := 
 ePulse/2 + ePulse/\[Pi]*ArcTan[Sin[\[Pi] t/wup]*smoothness]


Pulso retângulo com 2 larguras diferentes:

Não conheço a versão suave. Tentei construir uma versão simples do UnitBox.

smoothunitbox[t_, sharpness_] := 
 Piecewise[{{Tanh[sharpness*(2 t + 1)] + 1, 
     t < 0}, {1 - Tanh[sharpness*(2 t - 1)], t >= 0}}]/2
smoothRectangle[h_, wup_, wdown_, smoothness_, t_] := 
 With[{period = wup + wdown, duty = wup/(wup + wdown)}, 
  h*smoothunitbox[Mod[t/period, 1.]/(2. duty), smoothness]]

Plot[smoothRectangle[1, 2, 4, 20, t], {t, 0, 10}, Exclusions -> None]

Mas o bom não é bom. Como melhorar?

Respostas

3 cvgmt Nov 04 2020 at 20:29

use o mollifierem matemática. Também funciona para a Piecewisefunção.

Responder o comentário

a = 2;
b = 3;
S[x_ /; 0 <= x <= a] := 1;
S[x_ /; a <= x <= a + b] := 0;
S[x_ /; x >= a + b] := S[x - (a + b)];
S[x_ /; x <= a + b] := S[x + a + b];
ρ = 1/NIntegrate[Exp[-1/(1 - x^2)], {x, -1, 1}];
φ[x_, ϵ_] = (ρ/ϵ)*  Piecewise[{{Exp[-ϵ^2/(ϵ^2 - x^2)], -ϵ < x < ϵ}}];
Plot[S[x], {x, -2 (a + b), 2 (a + b)}]
Plot[NIntegrate[φ[t - x, .3]*S[x], {x, -2 (a + b), 
   2 (a + b)}], {t, -2 (a + b), 2 (a + b)}]

Atualizada

f[x_] = Piecewise[{{1, 0 <= x <= 2}}];
s[x_] = f[Mod[x, 4, -2]];
ρ = 1/NIntegrate[Exp[-1/(1 - x^2)], {x, -1, 1}];
φ[x_, ϵ_] = (ρ/ϵ)*Piecewise[{{Exp[-ϵ^2/(ϵ^2 - x^2)], -ϵ < x < ϵ}}];
Plot[s[x], {x, -4, 4}]
Plot[NIntegrate[φ[t - x, .3]*s[x], {x, -4, 4}], {t, -4, 4}]

Original

Mas não sei como suavizar o retângulo, apenas tento suavizar a Absfunção.

g[x_] = Piecewise[{{x, 0 <= x <= 1}, {-x, -1 <= x <= 0}}];
h[x_] = g[Mod[x, 2, -1]];
Plot[h[x], {x, -4, 4}]
ρ = 1/NIntegrate[Exp[-1/(1 - x^2)], {x, -1, 1}];
φ[x_, ϵ_] = (ρ/ϵ)*Piecewise[{{Exp[-ϵ^2/(ϵ^2 - x^2)], -ϵ < x < ϵ}}];
Plot[NIntegrate[φ[t - x, 1/8]*h[x], {x, -4, 4}], {t, -4,4}]

3 TedErsek Jan 15 2021 at 06:44

Suponha que você queira que a onda quadrada esteja alta em 20% do tempo. O seguinte ajuda.

DutyCycle = 0.2; Plot[Piecewise[{{x/(2 DutyCycle), 
x < DutyCycle}, {(1 - 2 DutyCycle + x)/(2 - 2 DutyCycle), 
DutyCycle < 1}}], {x, 0, 1}]

Com base nisso, podemos criar um período de nossa onda quadrada suave ao fazer isso.

singlePeriod[t_, Smoothness_, DutyCycle_] := Piecewise[{
{ArcTan[Sin[2 \[Pi] t/(2 DutyCycle)]*Smoothness]/
  ArcTan[Smoothness], t < DutyCycle},
{ArcTan[Sin[\[Pi] (1 - 2 DutyCycle + t)/(1 - DutyCycle)]*Smoothness]/
  ArcTan[Smoothness], DutyCycle < 1}
}];  Plot[singlePeriod[t, 12, 0.2], {t, 0, 1}, PlotRange -> All,Exclusions -> None]

Faça o acima periódico usando isto:

smoothPulse[t_,Smoothness_,DutyCycle_]:=singlePeriod[Mod[t,1],Smoothness,DutyCycle]; Plot[smoothPulse[t,12,0.2],{t,0,4},PlotRange->All,Exclusions->None]

Com o uso apropriado smoothPulse acima, podemos alterar o valor alto, o valor baixo, o período e a fase de um smoothPulse. Aqui está um exemplo:

Plot[2.5+2.5*smoothPulse[12t+0.2,12,0.2],{t,0,0.33333},PlotRange->All,Exclusions->None]