2012-04-10 1 views
0

나는 1 차원 문자열을 따라 웨이브 모션을 시뮬레이트하여 다른 웨이브 패킷을 시뮬레이션하는 프로그램을 만들고 있습니다. 웨이브 모션을 기술한다고 주장하는 "Python Scripting for Computational Science"라는 책에서 프로그램을 발견했습니다.하지만 책을 구현하는 방법이 확실하지 않습니다. (책은 Google 도서에 있었으며 텍스트는 이전/이후에 표시되지 않습니다. 암호).파이썬 : 문자열을 따라 1D 웨이브 모션을 시뮬레이트하는 프로그램 작성

예를 들어, "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() 
+4

정말 구체적인 질문이 필요합니다. "나는이 코드를 책에서 복사했고 그게 무슨 뜻인지 전혀 모르겠다."라고 StackOverflow에서 물어 보는 것은 좋은 질문이 아닙니다. 책의 코드가 무엇을 말하는지 알고 싶다면 실제로 책을 읽고 읽으십시오. – Amber

+0

글쎄, 나는 책을 얻을 수 없다. 도서관은 그것을 가지고 있지 않다. $ 55.96의 가격표는 그것을 사게한다.하지만 도움이된다면 내 질문을 단순화했다. 나는 정말로 단지 두 가지 기능만을 원합니다 (I와 f). 고마워, 앰버. – user1322973

+1

웨이브 방정식에 대한 연구를하고 싶습니까? 더 구체적으로 [1 차원 웨이브 방정식] (https://en.wikipedia.org/wiki/Wave_equation#Scalar_wave_equation_in_one_space_dimension)? 당신은 그것을 구현하기 전에 이것의 배후에있는 수학을 이해할 필요가 있습니다. –

답변

2

아래의 코드는 작동합니다 :

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) 

이것은 물리학에서 가장 중요한 미분 방정식 중 하나입니다. 이 PDE 또는 파의 해는 공간과 시간의 함수 인 함수에 의해 주어진다. u(x,t).

파도의 개념을 시각화하려면 두 가지 차원 인 공간과 시간을 고려하십시오. 시간을 수정하면 (예 : T1, 당신은 X의 기능을 얻을 것이다 : 이것은 당신이 방법을 이해하는 데 도움이됩니다

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

: 공간, X1의 특정 지점에서, 그러나

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

를, 파도는 시간의 함수이다 파가 전파됩니다. 해결책을 찾기 위해, 당신은 당신이 관심있는 일에 모든 possibles 파도를 제한하는 몇 가지 초기 및 경계 조건을 부과하기 위해 필요한이 특별한 경우를 들면 다음과 같습니다.

  • I = I(xi) 우리가 적용됩니다 초기 힘이다 섭동/파도가 발생합니다.
  • f = f(x,t)이라는 용어는 파를 생성하는 모든 외부 힘을 설명합니다.
  • c은 파 속도 임. 그것은 일정하다 (매체가 균질이라고 가정 할 때).
  • L은 PDE를 해결하려는 도메인의 길이입니다. 또한 상수.
  • n은 공간의 격자 점 수입니다.
  • dt은 시간 단계입니다.
  • tstop은 정지 시간입니다.
+0

이 코드의 애니메이션을 만들었습니다. 그러나 나는 100 개 이상의 요소를 얻을 때 또는 큰 시간 단계를 사용할 때 이상한 행동을 보입니다. 왜 누군가는 그 이유를 알고 있습니까? 여기 코드를보십시오 -> http://pastebin.com/7itv0WR2 – kame

+0

또한 C와 L을 바꿀 때 문제가 생깁니다. – kame

+0

CFL 상태와 관련된 불안정 문제가있는 경우,이 조건은 인과 관계에 기반한 시간 단계와 공간 단계의 크기. 그런 다음 dx의 크기, 즉 요소 수와 반비례하여 dt의 값을 줄입니다. – boclodoa

관련 문제