How to plot harmonics

46 次查看(过去 30 天)
JDilla
JDilla 2015-5-17
评论: Guillaume 2015-5-19
%PLOTTING TIME DEPENDENT MOTION OF A STANDING WAVE
%Define Parameters
a_n = 1;
k = 5;
w_n = 5;
x = 0:0.05:4;
t = 1:0.05:20;
for j=1:length(t)
for i=1:length(x)
u(i) = a_n*sin(k.* x(i)).* cos(w_n.*t(j)); %Formula for displacement
end
pause (0.1)
plot(u)
axis([1,65,-1.5,1.5])
grid on
end
Above is the code for a standing wave along a string. I need to create a few more of these, to end up with a series of standing waves which I can then calculate the sum of, which gives me the net displacement of the wave. I then need to plot this net displacement, which will result in a travelling wave.
Equation 1 on the formula sheet attached is the equation that governs the source that generates the series of standing waves. Tau is a 'tuning parameter'. I can just assign it a value. It determines the angular frequency. Imagine plucking a guitar. That is the source. We pluck the string of a guitar at a certain distance along the string. That distance is denoted as X_s (X subscript s). That can just be a value.
Equation 2 is the displacement for the nth standing wave (harmonic) where L is the length of the string, x is displacement and w_n (omega subscript n) is the angular frequency n is the harmonic number. I need to incorporate this somehow into the loop I have used to generate the wave in my code, in order to plot, lets say, the first 5 harmonics as subplots.
Equation 3 is then used to sum all of these harmonics together, to generate a final plot.
Any ideas on how to do this using the code and formula I have written
  2 个评论
JDilla
JDilla 2015-5-17
I was thinking of using symsum to calculate the sum of the standing waves,but this did not work.
JDilla
JDilla 2015-5-18
Any ideas??

请先登录,再进行评论。

回答(1 个)

Guillaume
Guillaume 2015-5-18
编辑:Guillaume 2015-5-18
Learn to use vectorisation. You can calculate all the u(x,t) at once:
Using ndgrid (or meshgrid):
x = 0:0.05:4;
t = 1:0.05:20;
[tt, xx] = ndgrid(t, x);
u = a_n*sin(k*xx).*cos(w_n*tt);
%now you can plot u
for j = 1:numel(t)
pause(0,1);
plot(u(j, :));
%...
Using bsxfun:
x = 0:0.05:4;
t = 1:0.05:20;
u = bsxfun(@(x, t) a_n*sin(k*x).*cos(w_n*t), x, t');
%now you can plot u
for j = 1:numel(t)
pause(0,1);
plot(u(j, :));
%...
If you want to add a third variable L, just add an extra dimension to u:
x = 0:0.05:4;
t = 1:0.05:20;
L = 1:5
[tt, xx, LL] = ndgrid(t, x, L);
u = a_n*sin(k*xx./LL).*cos(w_n*tt);
%sum all the L together:
u = sum(u, 3);
  6 个评论
JDilla
JDilla 2015-5-19
编辑:JDilla 2015-5-19
Thank you for your help
I want to plot the harmonics (first 5 harmonics individually, as subplots) and then sum a specified number (so I want to find the sum of 50) and plot it. Does that make sense? The third dimension you said was L? but L was length, which is just a variable.
Guillaume
Guillaume 2015-5-19
Right, I misread your image, I thought the harmonic was L. It does not change much anyway. You have, u as a function of three variables x, t and n:
u = f(x, t, n) %the specific of f don't matter.
You generate u all at once, for whatever combination of values:
x = 0:0.05:4;
t = 1:0.05:20;
n = 1:50;
[xx, tt, nn] = ndgrid(x, t, n);
u = f(xx, tt, nn);
And if you want to fix a variable, you just fix that dimension. For example to plot the first 5 harmonics at time t0
figure;
for nh = 1:5
subplot(nh, 1, 5);
plot(squeeze(u(:, t0, nh));
end
The sum of the 50 harmonics (3rd dimension) is still:
sum(u, 3)

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Measurements and Spatial Audio 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by