2012-02-24 3 views
1

나는 일주일 전 matplotlib로 시작했습니다. 나는Matplotlib로 다카기 기능을 플로팅

enter image description here

내가

from math import* 
import numpy as np 
import matplotlib.pyplot as plt 

def phi(x): 
    return min(ceil(x) - x, x - floor(x)) 

n=50 
    def f(x): 
     return sum([phi(x*2.0**i)/(2.0**i) for i in range (1,n)]) 

t = np.arange(0.0, 3.0, 0.1) 
plt.plot(t, map(f,t)) 
plt.show() 

내 코드를 변경하는 기능

enter image description here

을 그릴려고하지만 그것은 작동하지 않습니다. 내가 얻는 오류는 다음과 같습니다.

File "C:\Documents and Settings\Macedo\Desktop\exem.py", line 15, in <module> 
    plt.plot(t, map(f,t)) 
    File "C:\Python32\lib\site-packages\matplotlib\pyplot.py", line 2459, in plot 
    ret = ax.plot(*args, **kwargs) 
    File "C:\Python32\lib\site-packages\matplotlib\axes.py", line 3850, in plot 
    for line in self._get_lines(*args, **kwargs): 
    File "C:\Python32\lib\site-packages\matplotlib\axes.py", line 325, in _grab_next_args 
    for seg in self._plot_args(remaining, kwargs): 
    File "C:\Python32\lib\site-packages\matplotlib\axes.py", line 302, in _plot_args 
    x, y = self._xy_from_xy(x, y) 
    File "C:\Python32\lib\site-packages\matplotlib\axes.py", line 242, in _xy_from_xy 
    raise ValueError("x and y must have same first dimension") 
ValueError: x and y must have same first dimension 
+0

''phi'는'return' 문을 포함해야합니까? 마치 아무것도 반환하지 않는 것처럼 보입니다. –

+0

'return'을 'lambda'로 변경하려고 시도했지만 작동하지 않습니다. –

+0

당신의 합계를 어느 시점에서 자르시겠습니까? – katrielalex

답변

7

문제는 변수를 정의하는 방법입니다. 예를 들어, 당신이 쓴 :

def phi(x): 
    phi = lambda x: min(ceil(x) - x, x - floor(x)) 

당신은

def phi(x): 
    return min(ceil(x) - x, x - floor(x)) 

또는

phi = lambda x: min(ceil(x) - x, x - floor(x)) 

파이썬에서 함수 정의 및 람다 함수를 봐로 정의 할 수 있습니다.

f의 정의가 반복되어서는 안됩니다. 그래서 OU 오류,

plt.plot(t, map(f,t)) 

대신

plt.plot(t, f(t)) 

사용은 "파이썬 스칼라로 변환 할 수있는 유일한 길이-1 어레이"를 제거하는

n=50 
def f(x): 
    return sum([phi(x*2.0**i)/(2.0**i) for i in range (1,n)]) 

같은 뭔가가 필요 문제는 math.ceil에 스칼라가 필요하며 배열에서 요소별로 작동하지 않는다는 점입니다. 이는 원하는 것입니다. 따라서 map은 현재 t에 대해 f 요소 단위로 작동합니다.

그래서 마지막으로, 내가 사용하고있는 코드는 다음과 같습니다

from math import * 
import numpy as np 
import matplotlib.pyplot as plt 

def phi(x): 
    return min(ceil(x) - x, x - floor(x)) 

n=50 
def f(x): 
    return sum([phi(x*2.0**i)/(2.0**i) for i in range (1,n)]) 

t = np.arange(0.0, 3.0, 0.1) 
plt.plot(t, map(f,t)) 
plt.show() 

그리고 출력이 파이썬 2.7.2에

enter image description here

입니다. @ThomasK에서 제안한대로 Python 3의 경우 list(map(f,t))이 필요할 수 있습니다.

+0

변경했지만 오류가 남아 있습니다. –

+0

어떤 오류가 발생합니까? – highBandWidth

+0

타입 오류 : length-1 배열 만 파이썬 스칼라로 변환 될 수 있습니다. –

관련 문제