Fonction Smooth Boxcar (fonction Rectangle Pulse)

Nov 04 2020

Il y a quelques réponses sur la façon d'obtenir une fonction d'onde carrée lisse. Mais je voudrais avoir une fonction de wagon couvert lisse ou une fonction de rectangle avec 2 largeurs différentes .: wup, etwdown

Une solution est la transformée de Fourier, mais je préfère avoir une approximation avec un facteur de régularité.

Merci beaucoup.

Voici la version non lisse. Je voudrais le lisser. Notez que: ce n'est pas une fonction d'onde carrée (la version lisse est connue comme la solution . Il s'agit de la fonction wagon couvert avec 2 largeurs: la largeur vers le haut est de 2 et la largeur vers le bas est de 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]

Impulsion d'onde carrée avec largeur uniforme:

Je ne peux faire une version lisse que pour une fonction d'onde carrée, avec une largeur uniforme, mais pas la fonction rectangle.

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


Rectangle Pulse avec 2 largeurs différentes:

Je ne connais pas la version fluide. J'ai essayé de créer une version UnitBox fluide.

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]

Mais le lisse n'est pas bon. Comment améliorer?

Réponses

3 cvgmt Nov 04 2020 at 20:29

utilisez le mollifieren mathématiques. Cela fonctionne également pour la Piecewisefonction.

Répondre au commentaire

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)}]

Mise à jour

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

Mais je ne sais pas comment lisser le rectangle, j'essaye seulement de lisser la Absfonction.

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

Supposons que vous vouliez que l'onde carrée soit élevée 20% du temps. Ce qui suit aide.

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

Sur cette base, nous pouvons créer une période de notre onde carrée lisse en faisant cela.

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]

Rendez ce qui précède périodique en utilisant ceci:

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

Avec l'utilisation appropriée de smoothPulse ci-dessus, nous pouvons changer la valeur élevée, la valeur basse, la période et la phase d'un smoothPulse. Voici un exemple:

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