2015-05-27 16 views
6

Tôi đang cố gắng sử dụng SymPy để có dư lượng, trong trường hợp này các chức năng cotang. Tôi đã có một tích hợp() chức năng:Lỗi: function() phải mất ít nhất n đối số (n cho trước)

import sympy as sy 
import numpy as np 

def integrate(f, z, gamma, t, lower, upper, exact=True): 
    ''' 
    Integrate f(z) along the contour gamma(t): [lower, upper] --> C 

    INPUTS: 
    f - A SymPy expression. Should represent a function from C to C. 
    z - A SymPy symbol. Should be the variable of f. 
    gamma - A SymPy expression. Should represent a function from [lower, upper] to C. 
    t - A SymPy symbol. Should be the variable of gamma. 
    lower - The lower bound for the domain of gamma. 
    upper - The upper bound for the domain of gamma. 

    RETURN: 
    A complex number. 
    ''' 
    integrand = f.subs(z, gamma)*sy.diff(gamma, t) 
    ans = sy.integrate(integrand, (t, lower, upper)) 
    if exact: 
     return sy.simplify(ans) 
    if ~exact: 
     return sy.N(sy.simplify(ans)) 

mà tôi kêu gọi thusly:

def cot_res(n): 
    """Return the residue of the cotangent function at n*pi/2.""" 
    z, t = sy.symbols('z t') 
    f = sy.cot(z) 
    gamma = n*np.pi/2 + sy.exp(1j*t) 
    return 1/(2*np.pi*1j)*integrate(f, z, gamma, 0, 2*sy.pi, exact=True) 

for i in xrange(10): 
    print i/2., cot_res(i) 

Và tôi vẫn gặp lỗi integrate() takes at least 6 arguments (6 given) và tôi không chắc chắn nơi vấn đề của tôi là. Tôi đã thử khởi động lại hạt nhân.

Trả lời

12

Khi bạn nhận được thông báo lỗi cho biết Python không thể đếm đối số, thường là vì số đối số bạn đã vượt qua bằng số đối số bắt buộc, nhưng bạn thiếu một số đối số bắt buộc và bao gồm một số đối số đối số tùy chọn. Trong trường hợp này, bạn phải định nghĩa sau đây:

def integrate(f, z, gamma, t, lower, upper, exact=True): 

và cuộc gọi sau đây:

integrate(f, z, gamma, 0, 2*sy.pi, exact=True) 

Nếu chúng ta xếp chúng, chúng ta thấy

def integrate(f, z, gamma, t, lower, upper, exact=True): 

    integrate(f, z, gamma, 0, 2*sy.pi,  exact=True) 

rằng bạn đang bỏ lỡ một của lower, upper, hoặc t, nhưng vì bạn đã cung cấp exact, các báo cáo lỗi bị nhầm lẫn.

Python 3 có một thông báo lỗi tốt hơn cho những thứ như thế này:

>>> def f(a, b=0): pass 
... 
>>> f(b=1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: f() missing 1 required positional argument: 'a' 
Các vấn đề liên quan