我正在尝试使用多个值绘制函数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()
这是否能说明我的问题?
我在这里做错了什么? 谢谢!
答案 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()