如何用matplotlib将这个分段函数绘制到Python中?

mspsb9vt  于 2022-11-21  发布在  Python
关注(0)|答案(3)|浏览(136)

下面是我需要绘制的函数:

这是我的代码:

pi = np.pi
sin = np.sin
e = np.e

x1 = np.linspace(-10*pi, -pi)
y1 = (4*pi*(e**0.1*x1)) * sin(2*pi*x1)
plt.plot(x1, y1)

x2 = np.linspace(-pi, -pi/2)
y2 = 0
plt.plot(x2, y2)

x3 = np.linspace(-pi/2, pi/2)
y3 = 4/pi * x3**2 - pi
plt.plot(x3, y3)

x4 = np.linspace(pi/2, pi)
y4 = 0
plt.plot(x4, y4)

plt.show()

但是每次我试图运行它时,它都会给我一个ValueError:

ValueError: x and y must have same first dimension, but have shapes (50,) and (1,)

我试过使用np.piecewise,但没有任何效果。

mrzz3bfm

mrzz3bfm1#

为了定义分段函数,我通常使用numpy.where的链式序列。
首先,定义域为自变量,然后是条件与解析表达式,最后用一个差分为where,如docs中所解释的。

NB:你确定西内斯的圆频率是2π吗?当我看到一个域表示为π的倍数时,我会立即想到频率表示为整数或简单的分数...

from numpy import exp,linspace, pi, sin, where
from matplotlib.pyplot import grid, plot, show

x = linspace(-10*pi, +10*pi, 4001)
y = where(x <  -pi, 4*pi*exp(+x/10)*sin(1*x),
    where(x <-pi/2, 0,
    where(x <+pi/2, 4*x*x/pi-pi,
    where(x <  +pi, 0,
                    4*pi*exp(-x/10)*sin(1*x)))))
    
plot(x, y) ; grid() ; show()

PS系列
在注解Davide_sd中正确地指出,只有当分段函数连续时,我所展示的技术才是正确的。
如果子域之间存在不连续性,您可以始终使用numpy.where,但您应该在不连续点处将np.nan值赋给y数组,以便Matplotlib知道她必须断开NaN上的线。

  • EDIT -我更改了西内斯的循环频率,因为我无法理解OP规格。
wvt8vs2t

wvt8vs2t2#

x2是一个数组,y2是一个数字,matplotlib希望两者都是数组,因此您应该将y2和y4的定义切换为y2 = np.zeros_like(x2)y4 = np.zeros_like(x4)

nle07wnf

nle07wnf3#

由于x和y需要是相同的第一维,您可能希望将y2和y4定义为x的函数,以便生成相同维度的数组作为要绘制的结果。

#...
y2 = x2*0
plt.plot(x2, y2)

#...

y4 = x4*0
plt.plot(x4, y4)

或者,可以将y2和y4分别定义为大小与x2和x4相同的零数组。

y2 = np.zeros(x2.shape)
y4 = np.zeros(x4.shape)

相关问题