Question

Mon projet m'oblige à utiliser Matlab pour créer une équation symbolique avec une onde carrée à l'intérieur.J'ai essayé de l'écrire comme ceci mais en vain :

syms t;
a=square(t);

Les arguments d'entrée doivent être « doubles ».

Que puis-je faire pour résoudre ce problème ?Merci d'avance pour les aides proposées.

Était-ce utile?

La solution

voici quelques options générales utilisant floor et sign les fonctions:

f=@(A,T,x0,x) A*sign(sin((2*pi*(x-x0))/T));
f=@(A,T,x0,x) A*(-1).^(floor(2*(x-x0)/T));

Ainsi par exemple en utilisant le floor fonction:

 syms x
 sqr=2*floor(x)-floor(2*x)+1;
 ezplot(sqr, [-2, 2])

enter image description here

Autres conseils

Voici quelque chose pour vous aider à démarrer.Rappelons que nous pouvons exprimer une onde carrée comme Extension de la série de Fourier.Je ne vous dérangerai pas avec les détails, mais vous pouvez représenter n'importe quel périodique fonctionner comme une sommation de cosinus et de sinus (à la @RTL).Sans entrer dans la dérivation, voici l’équation fermée pour une onde carrée de fréquence f, avec une amplitude crête à crête de 2 (c'est-à-direça passe de -1 à 1).Rappelez-vous que la fréquence est la quantité de cycles par seconde.Donc, f = 1 signifie que nous répétons notre onde carrée chaque seconde.

Fourier

En gros, ce que vous devez faire est de coder la première ligne de l'équation...mais comment diable ferais-tu ça ?Bienvenue dans le monde du Boîte à outils mathématiques symboliques.Ce que nous devrons faire au préalable, c’est déclarer quelle est notre fréquence.Assumons f = 1 pour l'instant.Avec la Symbolic Math Toolbox, vous pouvez définir ce qui est considéré comme variables mathématiques au sein de MATLAB.Ensuite, MATLAB dispose de toute une suite d'outils que vous pouvez utiliser pour évaluer les fonctions qui reposent sur ces variables.Un bon exemple serait si vous souhaitez utiliser ceci pour définir un forme fermée solution d'une fonction f(x).Vous pouvez alors utiliser diff pour différencier et voir quelle est la dérivée.Essayez-le vous-même :

syms x;
f = x^4;
df = diff(f);

syms indique que vous déclarez tout ce qui suit l'instruction comme étant une variable mathématique.Dans ce cas, x c'est juste ça. df je devrais maintenant te donner 4x^3.Cool hein ?Quoi qu’il en soit, revenons à notre problème actuel.On voit qu'il y a en fait deux variables dans la fonction carré périodique qu'il faut définir : t et k.Une fois que nous avons fait cela, nous devons d’abord créer notre fonction qui se trouve à l’intérieur de la sommation.Nous pouvons le faire en :

syms t k;
f = 1; %//Define frequency here
funcSum = (sin(2*pi*(2*k - 1)*f*t) / (2*k - 1));

Cela règle ce problème...maintenant, comment pouvons-nous encapsuler cela dans une somme infinie !?Le sum La commande dans MATLAB suppose que nous avons un tableau fini sur lequel faire la somme.Si vous souhaitez additionner symboliquement une fonction, nous devons utiliser le symsum fonction.Nous l'appelons généralement ainsi :

funcOut = symsum(func, v, start, finish);

func est la fonction que nous souhaitons résumer. v est la variable de sommation que nous souhaitons utiliser pour indexer la somme.Dans notre cas, c'est k. start est le début de la somme, qui vaut 1 dans notre cas, et finish C'est ici que nous souhaitons terminer notre résumé.Dans notre cas, c'est l'infini, et MATLAB a donc un mot-clé spécial appelé Inf pour désigner cela.Donc:

xsquare = (4/pi) * symsum(funcSum, k, 1, Inf);

xquare contient désormais votre représentation d'une onde carrée définie en termes de Symbolic Math Toolbox.Maintenant, si vous voulez tracer votre onde carrée et voir si nous avons raison.Nous pouvons faire ce qui suit.Allons entre -3 <= t <= 3.En tant que tel, vous feriez quelque chose comme ceci :

tVector = -3 : 0.01 : 3; %// Choose a step size of 0.01
yout = subs(xsquare, t, tVector);

Vous remarquerez cependant que certaines valeurs seront NaN.La raison en est que juste à un multiple de la période (T = 1, 2, 3, ...), le comportement est indéfini car la dérivée droite à ces points est indéfinie.En tant que tel, nous pouvons remplir cela en utilisant soit 1 ou -1.Choisissons simplement 1 pour l'instant.De plus, comme la série de Fourier est généralement une fonction à valeurs complexes et que l'onde carrée est purement réelle, la sortie de cette fonction vous donnera en fait un vecteur à valeurs complexes.Il suffit donc de découper les parties complexes pour obtenir uniquement les parties réelles :

yout = real(double(yout)); %// To cast back to double.
yout(isnan(yout)) = 1;
plot(tVector, yout);

Vous obtiendrez quelque chose comme :

Square Wave

Vous pouvez également faire cela ezplot façon en faisant: ezplot(xsquare).Cependant, vous verrez qu'aux points où la vague se répète, nous obtenons NaN valeurs et il y a donc une déconnexion entre le pic haut et le pic bas.

Note:

La solution de Natan est beaucoup plus élégante.J'étais encore en train d'écrire ce message au moment où il a publié quelque chose.Quoi qu'il en soit, je voulais donner une perspective plus de traitement du signal sur la façon de procéder.Allez Fourier !

une série de Fourier pour la vague carrée d'amplitude de l'unité est:

alpha + 2/Pi*sum(sin( n * Pi*alpha)/n*cos(n*theta),n=1..infinity)

Voici une astuce pratique:

 cos(n*theta) = Re( exp( I * n * theta)) 

et

1/n*exp(I*n*theta) = I*anti-derivative(exp(I*n*theta),theta)

Mettez tout ensemble: tirez l'opérateur anti-dérivé (ou intégral) hors somme, et vous obtenez une série géométrique.Puis intégrer et enfin prendre la partie réelle.

résultat:

squarewave= 
alpha+ 1/Pi*Re(I*ln((1-exp(I*(theta+Pi*alpha)))/(1-exp(I*(theta-Pi*alpha)))))

Je l'ai essayé à Maple et ça marche génial!(probablement pas très pratique cependant)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top