在多个常量上绘制函数

时间:2018-09-26 18:40:03

标签: python numpy matplotlib plot scipy

我正在尝试使用多个值绘制函数f(x),以便在一个图形上全部使用唯一的常数。我以前做过,而且效果很好。但是当使用与该函数相同的方法时,出现错误消息

  

x和y必须具有相同的第一尺寸,但形状为(1000,)和(1,)

import matplotlib.pyplot as plt
import scipy as s

x = s.linspace(0,2* s.pi, 1000)
m = [1.1, 1.2, 1.3, 1.5, 2.0]
m = s.asarray(m)
m = m[:, s.newaxis]

def f(x): 
    return [m**2 /(4*s.cos(x/2))] [ (m*s.cos(x/2) - 1)*(m - s.cos(x/2))] / (1 + m**2 - 2*m*s.cos(x/2))**2

plt.plot(x,m[0], x,m[1], x,m[2], x,m[3], x,m[4])
plt.show()

编辑:

当尝试设置m=1.1而不是列表,并将其仅绘制为m的一个值时,出现以下错误消息。

  

TypeError:仅整数标量数组可以转换为标量索引

这是我的代码。

import matplotlib.pyplot as plt
import scipy as s

x = s.linspace(0,2* s.pi, 1000)
m=1.1

def f(x): 
    return [m**2 /(4*s.cos(x/2))] [ (m*s.cos(x/2) - 1)*(m - s.cos(x/2))] / ( 1 + m**2 - 2*m*s.cos(x/2))**2

plt.plot(x,f(x))
plt.show()

这是否能说明我的问题?


我在这里做错了什么? 谢谢!

2 个答案:

答案 0 :(得分:2)

将常量作为参数传递:

def f(x, m):
    numerator = m**2*(m*s.cos(x/2) - 1)*(m - s.cos(x/2))
    denominator = 4*s.cos(x/2)*(1 + m**2 - 2*m*s.cos(x/2))**2
    return numerator/denominator

fig, ax = plt.subplots()
m_arr = s.asarray([1.1, 1.2, 1.3, 1.5, 2.0])
for const_m in m_arr:
    ax.plot(x, f(x, const_m))

答案 1 :(得分:1)

我不认为您的函数正在返回您想要的东西。在回叫中,您尝试使用计算出的值索引到第一个数组中,这给您带来TypeError: only integer scalar arrays can be converted to a scalar index错误 例如[1,2,3,4][1]给您2,但[1,2,3,4][1.5]会引发错误。

如果我使用原始数组进行索引,那么基于值常量的行会变得干净整洁

import matplotlib.pyplot as plt
import numpy as np
import scipy as s

x = s.linspace(0,2* s.pi, 1000)
m = [1.1, 1.2, 1.3, 1.5, 2.0]
m = np.array(m).reshape(-1,1)

def f(x): 
    return  np.array([m**2 /(4*s.cos(x/2))][0]).T.dot(np.array([ (m*s.cos(x/2) - 1)*(m - s.cos(x/2))] / (1 + m**2 - 2*m*s.cos(x/2))**2)[0])

plt.plot(x,m[0]*x, x,m[1]*x, x,m[2]*x, x,m[3]*x, x,m[4]*x)
plt.show()

plot here