Wave on string: How can I create a traveling triangle pulse?

  • #1
18
0
I have the following program that moves a wave on a string with fixed ends. The program solves the wave equation given a initial condition wave. The initial condition is a triangle wave splitting into two pulses.

Here is the code written in Python:

Python:
from numpy import *
from  matplotlib.pyplot import *

N = 201 # Number of mass points
nT = 1200 # Number of time points
mi = 0.02
m = [mi]*(N) # mass array of points on string
m[-1] = 0.02
m[0] = 0.02
ki = 10.
k = [ki]*(N) # Spring constant
k[-1] = 0
k[0] = 0
dx = 0.295
kappa = ki*dx
my = mi/dx
c = sqrt(kappa/my) # velocity
print c
dt = 0.9*dx/c # Courier


x = arange( N )*dx
t = arange( N )*dt


y = zeros( [N, nT ] )

#Initial condition with t= 0
for i in range(N-1):
    if (70 <= i <= 99):
        y[i,0] = (i - 69.)/30
    elif (100 <= i <= 128):
        y[i,0] = ((129 - i)/30.)
    else:
        y[i,0] = 0.


#Wave equation
for j in range(nT-1):
 
    for i in range(N-1):
        if j == 0:
            y[i,j+1] = 2*y[i,j] - y[i,j] + (dt**2/m[i])*(k[i-1]*y[i+1,j] - 2*k[i-1]*y[i,j] + k[i]*y[i-1,j] )
        else:
            y[i,j+1] = 2*y[i,j] - y[i,j-1] + (dt**2/m[i])*( k[i-1]*y[i+1,j] - 2*k[i-1]*y[i,j] + k[i]*y[i-1,j] )

    cla()
  
    ylim(-1,1)
    plot(x,y[:,j-2])
    pause(0.001)
Here is the plot:

figure_55.png




I want to make changes to my program so the one triangle wave pulse moves to the right and gets reflected instead of splitting up in two opposite moving pulses. How can I change my initial conditions to make this possible? I want something like this:
Wave_equation_1D_fixed_endpoints (1).gif






EDIT:I am not sure if the pictures was correctly added!
 
Last edited:

Answers and Replies

  • #3
berkeman
Mentor
58,004
8,065
The pictures have been Uploaded now. Thanks @jedishrfu :smile:
 
  • #4
1,973
264
I want to make changes to my program so the one triangle wave pulse moves to the right and gets reflected instead of splitting up in two opposite moving pulses. How can I change my initial conditions to make this possible? I want something like this:
View attachment 200293
You need to specify the initial speed of the triangle wave as well. Or you could move one of the ends. That's what you would do with a real string.
 
  • #5
18
0
You need to specify the initial speed of the triangle wave as well. Or you could move one of the ends. That's what you would do with a real string.
But how can I implement this initial velocity?
 
  • #6
1,973
264
But how can I implement this initial velocity?
It's more usual, to use 2 arrays, one of them with the positions and one of the with the velocities, and then use y[x][t] += v[x][t] * dt and v[x][t] += dt * acceleration,
What you have done is to store the complete history of the positions of the string. You then use the difference between the two last values of the position to add to the last postion to get the next position.
your y[i,j+1] = 2*y[i,j] - y[i,j-1] + ...... does this. But this doesn't work if j is 0, so you use y[i,j+1] = y[i,j] + .... . The effect of this is to make the initial velocity 0.
If you want to set a nonzero initial velocity you must initializie both y[i,0] and y[i,1] to different values
 
  • Like
Likes Omsin

Related Threads on Wave on string: How can I create a traveling triangle pulse?

Replies
50
Views
2K
Replies
4
Views
2K
Replies
3
Views
444
  • Last Post
Replies
9
Views
17K
Replies
5
Views
408
  • Last Post
Replies
15
Views
2K
Replies
15
Views
807
Replies
1
Views
460
Replies
4
Views
4K
Top