2013-04-12 1 views
1

행렬과 관련하여 다음 코드에서 오류가 발생했습니다. 어떤 일이 일어 났는지 설명 할 수 있습니까? 나는 Python에 익숙하지 않고 오류를 이해할 수 없다. 이 코드는 켈러 박스 (keller box)를 사용하여 경계층을 풀거나 매트릭스에서 행렬이라고도합니다. 여기에 전체 코드를Keller Box의 행렬, 값을 검색하는 중 오류가 발생했습니다.

import numpy as npy 

blt = int(raw_input("Input the boundary layer thickness = ")) 
deleta = float(raw_input("Input the step size of boundary layer thickness = ")) 
np = int((blt/deleta) + 1) 
stop = 1 
k=1 
l=2 
g=2 
eselon = 0.00001 

def eta(j,k): 
    if j == 1 and k == 1: 
     return 0 
    else: 
     return eta(j-1,k) + deleta; 
deta = deleta 
def etanp(): 
    return eta(np,k)  
def f(j,k): 
    return -eta(np,1)*etab2 + etanp()*etab1 + eta(j,1) 
def u(j,k): 
    return -3*etab1 + 2*etab +1 
def v(j,k): 
    return (-6/etanp()*etab + (2/etanp())) 
def fb(j,k): 
    return 0.5 * (f(j,k) + f(j-1,k)) 
def ub(j,k): 
    return 0.5 * (u(j,k) + u(j-1,k)) 
def vb(j,k): 
    return 0.5*(v(j,k) + v(j-1,k)) 
def fvb(j,k): 
    return fb(j,k)*vb(j,k) 
def uub(j,k): 
    return ub(j,k) * ub(j,k) 

def a1(j,k): 
    return 1 + 0.5*deta *fb(j,k) 
def a2(j,k): 
    return -1 + 0.5*deta *fb(j,k) 
def a3(j,k): 
    return 0.5 * deta * vb(j,k) 
def a4(j,k): 
    return a3(j,k) 
def a5(j,k): 
    return -1 * deta * ub(j,k) 
def a6(j,k): 
    return a5(j,k) 

def r1(j,k): 
    return f(j-1,k) - f(j,k) + deta * ub(j,k) 
def r2(j,k): 
    return u(j-1,k) - u(j,k) + deta * vb(j,k) 
def r3(j,k): 
    return v(j-1,k)-v(j,k) - deta *((fvb(j,k)*uub(j,k)))-deta 

def AJ(j,k): 
    if j == 2: 
     return npy.matrix([[0,1,0],[-0.5*deta,0,-0.5*deta],[a2(2,k), a3(2,k), a1(2,k)]]) 
    else: 
     return npy.matrix([[-0.5*deta,0,0],[-1,0,-0.5*deta],[a6(j,k),a3(j,k),a1(j,k)]]) 
def BJ(j,k): 
    return npy.matrix([[0,-1,0],[0,0,-0.5*deta],[0,a4(j,k),a2(j,k)]]) 
def CJ(j,k): 
    return npy.matrix([[-0.5*deta,0,0],[1,0,0],[a5(j,k),0,0]]) 

def alfa(j,k): 
    return AJ(j,k) - (BJ(j,k)*gamma(j,k)) 
def gamma(j,k): 
    return npy.matrix.I((alfa(g,k))*CJ(g,k)) 
def rr(j,k): 
    return npy.matrix([[r1(j,k)],[r2(j,k)],[r3(j,k)]]) 
def ww(j,k): 
    if j == 2: 
     return npy.matrix.I(AJ(2,k)*rr(2,k)) 
    else: 
     return npy.matrix.I((alfa(j,k))*(rr(j,k)-(BJ(j,k)*ww(j-1,k)))) 

def dell(j,k): 
    if j == np: 
     return ww(np,k) 
    else: 
     return ww(j,k) - (gamma(j,k)*dell(j+1,k)) 
def delf(j,k): 
    if j == 1: 
     return 0 
    elif j == 2: 
     return dell(2,k)[2,1] 
    else: 
     return dell(j,k) 
def delu(j,k): 
    if j == 1 or j == np: 
     return 0 
    elif j == np-1: 
     return dell(j,k)[1,1] 
def delv(j,k): 
    if j == 1: 
     return dell(2,k)[1,1] 
    elif j == 2: 
     return dell(2,k)[3,1] 
    else: 
     return dell(j,k)[3,1] 

def ffinal(j,l): 
    return f(j,k) + delf(j,k) 
def ufinal(j,l): 
    return u(j,k) + delu(j,k) 
def vfinal(j,l): 
    return v(j,k) + delv(j,k) 

# Beginning of calculation for Keller-Box 

while stop > eselon: 
    eta(1,1) 
    for j in range (2,np): 
     eta(j,k) 

# Initial condition 
    etab = eta(j,k)/eta(np,k) 
    etab1 = etab**2 
    etab2 = etab**3 
    for j in range (1,np): 
     deta 
     f(j,1) 
     u(j,1) 
     v(j,1) 

# Current value of Central Differentiation 
    for j in range (2,np): 
     fb(j,k) 
     ub(j,k) 
     vb(j,k) 
     fvb(j,k) 
     uub(j,k) 
     a1(j,k) 
     a2(j,k) 
     a3(j,k) 
     r1(j,k) 
     r2(j,k) 
     r3(j,k) 
# Matrices Value for A1, Aj, Bj, and CJ 
     CJ(j,k) 
     AJ(j,k) 
     BJ(j,k) 
# Recursion: Forward Sweeping 
    for j in range (3,np): 
     alfa(j,k) 
     gamma(j,k) 
    for j in range(2,np): 
     rr(j,k) 
    for j in range(3,np): 
     ww(j,k) 

# Recursion: Backward Sweeping 
    for j in range (np-1,2,-1): 
     dell(j,k) 

    for j in range (np,3,-1): 
     delu(j-1,k) 
     delf(j,k) 
     delv(j,k) 

# Newton's Method 
    for j in range (1,np): 
     ffinal(j,l) 
     ufinal(j,l) 
     vfinal(j,l) 

# Check the convergence of iteration 
    stop = npy.abs(delv(1,k)) 
    kmax = k 
    k =+ 1 

cfrex = vfinal(1,kmax) 

print cfrex 
+0

어떤 오류를 이해할 수 없습니까? – graphite

+0

Traceback (가장 최근의 마지막 호출) : 파일 "C : \ Python 2.7 Win \ WinPython-64bit-2.7.3.3 \ python-2.7.3.amd64 \ Scripts \ FYP new coding.py", 줄 150, CJ (j, k) 파일 CJ 에있는 "C : \ Python 2.7 Win \ WinPython-64bit-2.7.3.3 \ python-2.7.3.amd64 \ Scripts \ FYP new coding.py", 82 행, 파일 반환 매트릭스 [ [-0.5 * deta (j, k), 0,0], [1,0,0], [a5 (j, k), 0,0]] TypeError : 'type'개체에 '__getitem__' "이 오류" – faridCS227

+0

행렬을 사용 하시겠습니까? [Scipy.org는 배열을 권장합니다.] (http://www.scipy.org/NumPy_for_Matlab_Users#head-e9a492daa18afcd86e84e07cd2824a9b1b651935). – atomh33ls

답변

1

있어 당신은 괄호로 numpy.matrix 호출해야합니다 :

>>> numpy.matrix([[1,2],[1,2]]) 
matrix([[1, 2], 
     [1, 2]]) 

numpy tutorial를 사용해보십시오.

+0

은 numpy.matrix()는 정의 함수입니까? 그것을 호출하려면 matrix()를 사용하여 호출해야합니까? – faridCS227

+0

친애하는 흑연, 여기서 틀린 것이 무엇인지 설명하는 마음? TypeError : deta()는 정확히 2 개의 인수를 사용합니다 (주어진 경우 1) – faridCS227

+0

하나의 인수를 함수 deta에 전달합니다. 함수 deta에는 2 개의 인수가 사용됩니다. 그것이 발생한 곳의 라인을 확인하십시오. – graphite

1

업데이트 : 각 단지 다른 전화 때문에

def alfa(j,k): 
    print 'alfa({},{}) called'.format(j,k) 
    return AJ(j,k) - (BJ(j,k)*gamma(j,k)) 

def gamma(j,k): 
    print 'gamma({},{}) called'.format(j,k) 
    return npy.matrix.I((alfa(g,k))*CJ(g,k)) 

영원히 관계없이이 인수로 주어진 것에 실행되지 않습니다 그리고 그들은 종료 할 방법이 없습니다 : 정의 귀하의 기능 alfagamma은 다음과 . 즉, 입력에 관계없이 각 함수는 다른 함수를 호출합니다.


내가 볼 수있는 코드에는 몇 가지 오류가 있습니다. npy.matrix이 인수 괄호없이 호출되고이 언급 한 @graphite입니다

1) :

def A1(j,k): 
    return npy.matrix[[0,1,0],[-0.5*deta(2,k),0,-0.5*deta(2,k)],[a2(2,k), a3(2,k), a1(2,k)]] 
# needs parentheses: 
    return npy.matrix([[0,1,0],[-0.5*deta(2,k),0,-0.5*deta(2,k)],[a2(2,k), a3(2,k), a1(2,k)]]) 

수정이 사방이 r의 당신의 정의에서 npy.matrix

2)를 사용하여, 당신은 내가 무엇을해야한다고 생각하는지 알 수 없다. k :

def r1(j,k): 
    return f(j-1,k) - f(j,k) + deta(j,) * ub(j,k) 
#should be: 
    return f(j-1,k) - f(j,k) + deta(j,k) * ub(j,k) 

3) 여기 np1이 정의되지 않았습니다. 아마도 np일까요?

def etab(): 
    return eta(j,k)/eta(np,k) 
def etab1(): 
    return etab()*etab() 
def etab2(): 
    return etab()*etab()*etab() 

수 :

# Recursion: Backward Sweeping 
    for j in range (np1,2,-1): 
     dell(j,k) 

그러나

일반적으로이 코드는 훨씬 더 읽기 (그리고 버그를 발견하는 것이 용이)는 예를 들어 적은 기능, 인수없이 특히 함수를 정의하면 만들 수있는

etab = eta(j, k)/eta(np, k) 
etab1 = etab**2 
etab2 = etab**3 

다른 예 :

def deta(j,k): 
    return deleta 
0123으로 대체

j 또는 k 사용하지 않는, 그래서 당신에 모든 것을 바꿀 수 : 대신 deta(j, k)를 작성하거나 deta(2, k) 그냥 deta을 쓸 수의 아래 사방

deta = deleta 

합니다. 물론 deta이 실제로 다른 j 또는 k에 대해 변경되도록 향후 어느 시점에서 코드를 변경하려는 경우 그대로 유지할 수 있습니다.

도움이 되었기를 바랍니다.

+0

ewchan, 내 상사를 언급했는데, blt 값은> 5이어야하고 프로그램을 출력하기 위해서는 deleta <0.1이어야한다고 말했습니다. 그건 그렇고, 프로그램에 누락 된 가치가 있습니다. 나는 당신의 참고를 위해 그것을 편집 할 것입니다. – faridCS227

관련 문제