试图绘制已定义的函数

时间:2016-07-01 06:23:36

标签: python numpy matplotlib

我有问题。我试图为d的不同值绘制函数。我已将d定义为:

d = np.arange(0.0, 100.0, 0.01)

但我仍然得到同样的错误:

  

TypeError:只能将length-1数组转换为Python标量

这是我的剧本:

import pylab
import numpy as np
import scipy
import matplotlib.pyplot as plt
import math
from scipy.optimize import curve_fit
import numpy

def teo_function(d):
    return 2*math.pi*math.sqrt(((1**2)/(12+d**2))/9.81*d)

d = np.arange(0.0, 100.0, 0.01)
T = teo_function(d)
pylab.plot (d,teo_function(d), 'bo', d, teo_function(d), 'k')

pylab.show()

感谢大家的帮助。

3 个答案:

答案 0 :(得分:3)

您必须对函数teo_function进行矢量化以使用数组:

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

def teo_function(d):
    return 2*math.pi*math.sqrt(((1**2)/(12+d**2))/9.81*d)
vecfunc = np.vectorize(teo_function)

d = np.arange(0.0, 100.0, 0.01)
T = vecfunc(d)
plt.plot (d, T, 'bo', d, T, 'k')
plt.show()

enter image description here

答案 1 :(得分:2)

函数teo_function使用math.sqrt,它适用于标量,而不是数组。如果您使用过numpy数组,请使用numpy中包含的数学运算,例如。 numpy.sqrt。 Numpy相当于我在math.module中所知的所有函数,这些函数已针对numpy数组进行了优化。

Numpy的功能也适用于标量,列表,元组和更多类型。

例如:

def teo_function(d):
    return 2*np.pi*np.sqrt(((1**2)/(12+d**2))/9.81*d)

答案 2 :(得分:1)

另一种方式。如果您希望函数返回列表

def teo_function(ds):
    return [2*math.pi*math.sqrt(((1**2)/(12+d**2))/9.81*d) for d in ds]