2012-02-24 8 views
1

私は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)) 

としてそれを定義するか、Pythonで関数定義とラムダ関数を検索します。

fの定義はループ内にあってはなりません。だから、OUエラー、

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

代わりの

plt.plot(t, f(t)) 

使う "Pythonのスカラに変換できるだけの長さ-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() 

、出力はこれは、Python 2.7.2である

enter image description here

です。 @ThomasKで提案されているように、Python 3の場合、list(map(f,t))が必要な場合があります。

+0

私は変更しましたが、エラーは残ります。 –

+0

どのようなエラーが表示されますか? – highBandWidth

+0

型エラー:長さ1の配列だけをPythonスカラーに変換することができます –