Função Smooth Boxcar (função Retângulo Pulso)
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
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}]
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}]
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]
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]