2010-10-04 4 views
2

Je fais ce qui suit dans MATLAB et cela fonctionne bien. Cependant, j'ai besoin de calculer 20 sinusoïdes au lieu de 3 et ensuite les tracer tous.Avec MATLAB calculer un certain nombre de sinusoïdes à l'intérieur d'une boucle for puis les tracer

x=sin(1*w*t)*(2/(pi*1)); 
y=sin(3*w*t)*(2/(pi*3)); 
z=sin(6*w*t)*(2/(pi*6)); 

plot(t,x,t,y,t,z) 

je figure, il devrait être possible de faire une boucle for et intrigue, mais je ne sais pas comment cela est fait et ont besoin d'aide.

Répondre

4

La fonction BSXFUN est une façon de résoudre votre problème, as illustrated by Amro. Toutefois, si vous êtes un récent utilisateur Matlab une solution pour boucle plus simple est peut-être plus facile à comprendre et à un peu moins intimidante:

w = 1;  %# Choose the value of w 
k = 1:20; %# Your 20 values to compute a sinusoid for 
N = 100; %# The number of time points in each sinusoid 

t = linspace(0,2*pi,N).'; %'# A column vector with N values from 0 to 2*pi 
X = zeros(N,numel(k));  %# A matrix to store the sinusoids, one per column 

for iLoop = 1:numel(k)  %# Loop over all the values in k 
    X(:,iLoop) = sin(k(iLoop)*w*t)*(2/(pi*k(iLoop))); %# Compute the sinusoid 
                %# and add it to X 
end 

plot(t,X); %# Plot all the sinusoids in one call to plot 

Voici quelques liens vers la documentation qui devrait être utile pour comprendre pleinement comment ce qui précède solution fonctionne: LINSPACE, NUMEL, ZEROS, PLOT, For loops, Preallocating arrays to improve performance.

+1

+1 Je suppose que vous avez raison, ces appels BSXFUN semblent effrayants;) – Amro

+2

@gnovice: J'étais sur le point de poster une solution similaire, même si je l'aurais tracée dans la boucle, puisque «hold on» est une commande utile à savoir. – Jonas

+0

Ya BSXFUN m'a fait un peu peur, même si ça a marché, alors je vais aller avec votre solution. Cependant, si je veux seulement tracer des nombres impairs de K, comment puis-je faire cela? J'ai essayé d'ajouter ceci mais je trace toujours le signal (mais la constante 0) var = mod (iLoop, 2); si var == 0 X (:, iLoop) = sin (k (iLoop) * w * t) * (2/(pi * k (iLoop))); – Mikael

8

Considérons cet exemple:

w = 2; 
t = (0:0.05:pi)';    %'# time axis 
p = [1 3:3:12];    %# parameters you loop over 

%# sinusoids over all possible parameters 
x = bsxfun(@times, sin(w*bsxfun(@times,p,t)), (2./(pi*p))); 
plot(t,x)      %# plot all of them at one 
legend(cellstr(num2str(p'))) 

alt text

Vous pouvez simplement changer le vecteur p à vos valeurs spécifiques

Questions connexes