Fonction Smooth Boxcar (fonction Rectangle Pulse)
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
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}]
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}]
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]
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]