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

AI Thread Summary
The discussion revolves around modifying a Python program that simulates wave motion on a string with fixed ends. The current implementation initializes a triangle wave that splits into two pulses, but the user wants to adjust the initial conditions so that a single triangle wave pulse moves to the right and reflects instead of splitting. Key suggestions include specifying an initial velocity for the wave and potentially moving one end of the string to achieve the desired effect. It is recommended to use two arrays: one for positions and another for velocities, allowing for the implementation of non-zero initial velocities. The current method of updating positions does not accommodate initial velocities correctly, as it initializes the first two time steps to the same value, resulting in zero initial velocity. To implement a non-zero initial velocity, both the initial position and the first time step must be set to different values.
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 Omsin
Thread 'Is this public key encryption?'
I've tried to intuit public key encryption but never quite managed. But this seems to wrap it up in a bow. This seems to be a very elegant way of transmitting a message publicly that only the sender and receiver can decipher. Is this how PKE works? No, it cant be. In the above case, the requester knows the target's "secret" key - because they have his ID, and therefore knows his birthdate.
I tried a web search "the loss of programming ", and found an article saying that all aspects of writing, developing, and testing software programs will one day all be handled through artificial intelligence. One must wonder then, who is responsible. WHO is responsible for any problems, bugs, deficiencies, or whatever malfunctions which the programs make their users endure? Things may work wrong however the "wrong" happens. AI needs to fix the problems for the users. Any way to...

Similar threads

Back
Top