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

Click For Summary

Discussion Overview

The discussion revolves around modifying a Python program that simulates a wave on a string with fixed ends. Participants are exploring how to adjust the initial conditions of a triangle wave pulse so that it moves to the right and reflects, rather than splitting into two opposite-moving pulses. The focus includes programming techniques and the physics of wave motion.

Discussion Character

  • Exploratory, Technical explanation, Debate/contested

Main Points Raised

  • One participant shares a Python code that simulates a wave on a string and describes the current behavior of the triangle wave pulse.
  • Another participant suggests that to achieve the desired behavior, the initial speed of the triangle wave must be specified, or one of the ends of the string should be moved.
  • A later reply elaborates on the implementation of initial velocity, proposing the use of two arrays: one for positions and another for velocities, and discusses how to modify the existing code to accommodate nonzero initial velocity.
  • Participants discuss the implications of the current method of storing position history and how it affects the initial velocity of the wave pulse.

Areas of Agreement / Disagreement

There is no consensus on the best method to implement the changes needed for the wave pulse behavior, as participants are exploring different approaches and suggestions.

Contextual Notes

Participants have not fully resolved how to set the initial velocity or how to modify the existing code structure to achieve the desired outcome.

Omsin
Messages
18
Reaction score
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 # Courierx = arange( N )*dx
t = arange( N )*dty = 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:
Technology news on Phys.org
Nope the pictures didn't make it, you need to try again.
 
The pictures have been Uploaded now. Thanks @jedishrfu :smile:
 
Omsin said:
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.
 
willem2 said:
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?
 
Omsin said:
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   Reactions: Omsin

Similar threads

Replies
55
Views
7K
Replies
1
Views
3K
Replies
2
Views
2K
  • · Replies 15 ·
Replies
15
Views
2K
  • · Replies 17 ·
Replies
17
Views
3K
  • · Replies 6 ·
Replies
6
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 4 ·
Replies
4
Views
6K
Replies
1
Views
2K
  • · Replies 1 ·
Replies
1
Views
5K