在Python中绘制在x的不同间隔中具有不同方程的函数

时间:2015-11-29 23:28:21

标签: python

我试图将y绘制为x的函数。在每个x间隔中,函数会发生变化。我的代码如下。我最终得到一个空图。有什么想法吗?

import numpy as np
import pylab as pl 

x=np.arange(0,10,11)
y=np.arange(0,10,11)

for i in range (0,len(x)):
   if x>5.:
      y=5.
   if x>3. and x<5.:
      y=x**2
   if x>0. and x<3.:
      y=2.
   i+=1


pl.plot(x,y)
pl.xlim([-3.,7.])
pl.ylim([-3.,7.]) 
pl.xlabel('Social Interaction')
pl.ylabel('Color/Hue')
pl.title('Bifurcation Diagram')
pl.show()

1 个答案:

答案 0 :(得分:0)

循环的好程序总是试图通过打印出值来执行诊断。如果你在这里这样做,你会发现x只有一个元素。这是因为np.arange(0, 10, 11)表示从0开始,到10结束,并采取11步骤。由于11的步骤会立即超过10的结尾,因此x中只有一个元素,即x = array([0])。我不确定你在这里寻找什么。

一些快速说明:你不需要在python中进行比较的小数,即x > 5没问题,而不是x > 5.; range函数自动递增i,因此您不需要i += 1 ---它实际上并没有在此处执行任何操作;最后,rangenp.arange默认从0开始,因此您不需要包含该内容(即您可以使用np.arange(10)代替np.arange(0,10) }。

当您在for循环中迭代x时,您不会查看xy数组的各个元素 - 您正在查看整个阵列。如果您想一次查看单个值,则必须使用x[i]y[i]对数组建立索引,这样您就可以执行以下操作:

x = np.arange(10)  # this gives `array([0, 1, 2, ..., 9])`
y = np.arange(10)

for i in range (0,len(x)):
   if x[i] > 5:
      y[i] = 5
   if x[i] > 3 and x[i] < 5:
      y[i] = x[i]**2
   if x[i] > 0 and x[i] < 3:
      y[i] = 2

使用更高级的数组索引,您可以更快更清洁。如果你与numpy数组进行比较,它会给你一组布尔值,显示比较的真或假:

>>> x > 5
array([False, False, False, False, False, False,  True,  True,  True,  True], dtype=bool)

你也可以使用像这样的布尔数组作为另一个数组的索引,它的作用是打印布尔值为真的值,例如:

>>> x[x > 5]
array([6, 7, 8, 9])

因此,您可以使用它来设置y您想要的方式:

>>> y[x > 5] = 5
>>> y
array([0, 1, 2, 3, 4, 5, 5, 5, 5, 5])

您可以使用布尔&运算符来组合条件:

>>> inds = (x > 3) & (x < 5)
>>> y[inds] = x[inds]**2
>>> y
array([ 0,  1,  2,  3, 16,  5,  5,  5,  5,  5])