以特定的y间隔绘制函数

时间:2014-01-20 15:57:29

标签: python matplotlib exponentiation

我需要在同一个绘图上绘制一些指数曲线 - 约束条件是在y = 1时结束。

供参考,以下是代码:

from numpy import arange
from matplotlib import pyplot as plt

T = arange(60,89)
curve1 = 2**(T - 74)
curve2 = 2**(T - 60)
plt.plot(T,curve1 )
plt.plot(T,curve2 )
plt.show()

结果如下: curves 1 and 2 第二条曲线几乎看不到,因为这些数值相对较低。

我遇到的问题是所有这些曲线都相当快地达到700000+,但我只对范围(0,1)感兴趣。我如何绘制这些位,但是有很好的平滑曲线(这样一条曲线就不会中途停止)?

3 个答案:

答案 0 :(得分:3)

正如您所发现的,如果您为添加的每个功能调整范围(T),这很容易做到。但是,如果您需要更改功能,则需要重新检查它。

你正在处理的问题,通常是在给定y范围的情况下计算某些函数的x范围 - 或者,正如数学家所说的那样,确定对应于函数的函数的domain一系列的形象。然而,对于任意函数,这是不可能的,如果你的函数是injective,那么就有可能。

假设我们有一个函数y=f(x),而yrange是[y1,y2]。 x范围为[f^(-1)(y1), f^(-1)(y2]f^-1为f的inverse function

由于我们需要绘制多个函数,x_range只是最大范围 - 所有 - 最终范围的下半部分是所有范围下部的最小值,上部是最高部分。

以下是一些代表所有这些的代码,将步数作为参数,并在x范围内计算正确的T

from numpy import arange
from matplotlib import pyplot as plt
from sympy import sympify, solve

f1= '2**(T - 74)' #note these are strings
f2= '2**(T - 60)'

y_bounds= (0.001, 1) #exponential functions never take 0 value, so we use 0.001
mm= (min, max)
x_bounds= [m(solve(sympify(f+"-"+str(y)))[0] for f in (f1,f2)) for y,m in zip(y_bounds, mm)]
print x_bounds

N_STEPS=100 #distributed over x_bounds
T = arange(x_bounds[0], x_bounds[1]+0.001, (x_bounds[1]-x_bounds[0])/N_STEPS)

curve1 = eval(f1) #this evaluates the function over the range, by evaluating the string as a python expression
curve2 = eval(f2)
plt.plot(T,curve1)
plt.plot(T,curve2)
plt.ylim([0,1])
plt.show()

代码输出x范围(50.03, 74)和此图: final plot of two curves

答案 1 :(得分:3)

除了其他答案之外,可能值得在对数刻度上绘图,因为函数的增长基本上是指数级的。例如:

from numpy import arange
from matplotlib import pyplot as plt

T = arange(60,89)
curve1 = 2**(T - 74)
curve2 = 2**(T - 60)
plt.semilogy(T,curve1 )
plt.semilogy(T,curve2 )
plt.show()

enter image description here

答案 2 :(得分:2)

这个很容易:抱歉浪费时间。

只需通过

将y限制设置为[0,1]
plt.ylim([0,1])

你已经完成了。