38

私が指示した式をグラフ化する関数を作成しようとしています。

import numpy as np  
import matplotlib.pyplot as plt  
def graph(formula, x_range):  
    x = np.array(x_range)  
    y = formula  
    plt.plot(x, y)  
    plt.show()  

それを呼び出そうとすると、次のエラーが発生します。 に到達する前に乗算を実行しようとしていると思いますy = formula

graph(x**3+2*x-4, range(-10, 11))

Traceback (most recent call last):  
  File "<pyshell#23>", line 1, in <module>  
    graph(x**3+2*x-4, range(-10, 11))  
NameError: name 'x' is not defined  
4

3 に答える 3

73

あなたの推測は正しいです: コードはx**3+2*x-4すぐに評価しようとしています。残念ながら、それを防ぐことはできません。幸いなことに、Python では関数は第一級のオブジェクトです。つまり、関数を他の変数と同じように扱うことができます。したがって、関数を修正するには、次のことができます。

import numpy as np  
import matplotlib.pyplot as plt  

def graph(formula, x_range):  
    x = np.array(x_range)  
    y = formula(x)  # <- note now we're calling the function 'formula' with x
    plt.plot(x, y)  
    plt.show()  

def my_formula(x):
    return x**3+2*x-4

graph(my_formula, range(-10, 11))

すべてを 1 行で実行したい場合は、関数と呼ばれるものを使用できます。これは、 orlambdaを使用しない名前のない単なる短い関数です。defreturn

graph(lambda x: x**3+2*x-4, range(-10, 11))

の代わりにrangenp.arange(整数以外の増分が可能) とnp.linspaceを参照できます。これにより、使用する開始、停止、およびポイント数を指定できます。

于 2012-12-22T06:32:16.840 に答える
32

これは並んでいるからです

graph(x**3+2*x-4, range(-10, 11))

x は定義されていません。

最も簡単な方法は、プロットする関数を文字列として渡し、evalそれを式として評価するために使用することです。

したがって、最小限の変更を加えたコードは次のようになります

import numpy as np  
import matplotlib.pyplot as plt  
def graph(formula, x_range):  
    x = np.array(x_range)  
    y = eval(formula)
    plt.plot(x, y)  
    plt.show()

そして、あなたはそれを次のように呼び出すことができます

graph('x**3+2*x-4', range(-10, 11))
于 2012-12-22T06:37:51.860 に答える