Python: написание программы для имитации одномерного волнового движения вдоль струны.

Я работаю над программой, которая имитирует волновое движение вдоль одномерной струны, чтобы в конечном итоге имитировать различные волновые пакеты. Я нашел программу в книге "Python Scripting for Computational Science", которая претендует на описание волнового движения, хотя я не уверен, как это реализовать (книга была в Google Книгах и не показывает мне текст до/после код).

Например, я понимаю, что «f» — это функция от x и t, а «I» — это функция от x, но какие функции на самом деле нужны для создания волны?

I= 
f= 
c= 
L= 
n=
dt=
tstop=


x = linespace(0,L,n+1) #grid points in x dir
dx = L/float(n)
if dt <= 0: dt = dx/float(c) #max step time
C2 = (c*dt/dx)**2  #help variable in the scheme
dt2 = dt*dt

up = zeros(n+1) #NumPy solution array
u = up.copy()   #solution at t-dt
um = up.copy()    #solution at t-2*dt

t = 0.0
for i in iseq(0,n):
u[i] +0.5*C2*(u[i-1] - 2*u[i] +u[i+1]) + \
    dt2*f(x[i], t)
um[0] = 0;   um[n] = 0

while t<= tstop:
t_old = t; t+=dt
#update all inner points:
for i in iseq(start=1, stop= n-1):
up[i] = -um[i] +2*u[i] + \
    C2*(u[i-1] - 2*u[i] + u[i+1]) + \
    dt2*f(x[i], t_old)

#insert boundary conditions
up[0] = 0; up[n] = 0
#updata data structures for next step
um = u.copy(); u = up.copy()

person user1322973    schedule 10.04.2012    source источник
comment
Вам действительно нужно задать более конкретный вопрос. Я скопировал этот код из книги и понятия не имею, что это значит — не лучший вопрос для StackOverflow. Возможно, попробуйте на самом деле получить и прочитать книгу, если вы хотите знать, о чем говорит код книги.   -  person Amber    schedule 10.04.2012
comment
Ну, я не могу достать книгу (в библиотеке ее нет, а цена в 55,96 долларов исключает возможность ее покупки), но я немного упростил свой вопрос, если это поможет. Мне действительно нужны только две функции (I и f). Спасибо, Эмбер.   -  person user1322973    schedule 10.04.2012
comment
Возможно, вы хотите провести некоторое исследование волнового уравнения? В частности, одномерное волновое уравнение? Вам нужно понять математику, стоящую за этим, прежде чем вы сможете реализовать это.   -  person Li-aung Yip    schedule 10.04.2012
comment
Я нашел это на первой странице Google для Python Scripting for Computational Science без кавычек: frs.web.cern.ch/frs/Source/PythonBook2004.pdf   -  person Jesus is Lord    schedule 10.04.2012


Ответы (1)


Код ниже должен работать:

from math import sin, pi
from numpy import zeros, linspace
from scitools.numpyutils import iseq

def I(x):   
    return sin(2*x*pi/L)  

def f(x,t): 
    return 0

def solver0(I, f, c, L, n, dt, tstop):
    # f is a function of x and t, I is a function of x
    x = linspace(0, L, n+1) # grid points in x dir
    dx = L/float(n)
    if dt <= 0: dt = dx/float(c) # max time step
    C2 = (c*dt/dx)**2 # help variable in the scheme
    dt2 = dt*dt

    up = zeros(n+1) # NumPy solution array
    u = up.copy() # solution at t-dt
    um = up.copy() # solution at t-2*dt

    t = 0.0
    for i in iseq(0,n):
        u[i] = I(x[i])
    for i in iseq(1,n-1):
        um[i] = u[i] + 0.5*C2*(u[i-1] - 2*u[i] + u[i+1]) + \
                dt2*f(x[i], t)

    um[0] = 0; um[n] = 0

    while t <= tstop:
          t_old = t; t += dt
          # update all inner points:
          for i in iseq(start=1, stop=n-1):
              up[i] = - um[i] + 2*u[i] + \
                      C2*(u[i-1] - 2*u[i] + u[i+1]) + \
                      dt2*f(x[i], t_old)

          # insert boundary conditions:
          up[0] = 0; up[n] = 0
          # update data structures for next step
          um = u.copy(); u = up.copy()
    return u

if __name__ == '__main__':

# When choosing the parameters you should also check that the units are correct

   c = 5100
   L = 1
   n = 10
   dt = 0.1
   tstop = 1
   a = solver0(I, f, c, L, n, dt, tstop)  

Он возвращает массив со значениями волны в момент времени tstop и во всех точках нашей сетки решений.

Прежде чем применять его в практической ситуации, вы должны прочитать как о волновом уравнении, так и о методе конечных элементов, чтобы понять, что делает код. Его можно использовать для нахождения численных решений волнового уравнения:

Utt + beta*Ut = c^2*Uxx + f(x,t)

которое является одним из важнейших дифференциальных уравнений в физике. Решение этого УЧП или волны задается функцией, которая является функцией пространства и времени u(x,t).

Чтобы визуализировать понятие волны, рассмотрите два измерения, пространство и время. Если вы зафиксируете время, например. t1, вы получите функцию x:

U(x) = U(x,t=t1) 

Однако в конкретной точке пространства x1 волна является функцией времени:

U(t) = U(x=x1, t)

Это должно помочь вам понять, как распространяется волна. Чтобы найти решение, вам нужно наложить некоторые начальные и граничные условия, чтобы ограничить все возможные волны той, которая вас интересует. Для этого конкретного случая:

  • I = I(xi) — начальная сила, которую мы приложим, чтобы вызвать возмущение/волну.
  • Термин f = f(x,t) учитывает любую внешнюю силу, которая генерирует волны.
  • c — скорость волны; это константа (при условии, что среда однородна).
  • L — длина домена, в котором мы хотим решить УЧП; также константа.
  • n — количество точек сетки в пространстве.
  • dt - шаг по времени.
  • tstop - время остановки.
person anzupe    schedule 17.04.2012
comment
Я сделал анимацию этого кода. Но у меня странное поведение, когда я получаю более 100 элементов или когда использую большие временные шаги. Кто-нибудь знает, почему? См. код здесь --› pastebin.com/7itv0WR2 - person kame; 19.01.2014
comment
также проблемы, когда я меняю c и L. - person kame; 19.01.2014
comment
У вас проблемы с нестабильностью, связанные с условием CFL, это условие является ограничением на соотношение размера временного шага и размера пространственного шага, основанным на причинно-следственной связи. Затем просто уменьшите значение dt соответственно размеру dx, то есть обратно пропорционально количеству элементов. - person boclodoa; 06.11.2015
comment
Я кое-что сделал, используя код, который нашел здесь, он находится на github.com/rvelseg/string_resonance. - person boclodoa; 23.06.2016