我需要在同一个绘图上绘制一些指数曲线 - 约束条件是在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()
结果如下: 第二条曲线几乎看不到,因为这些数值相对较低。
我遇到的问题是所有这些曲线都相当快地达到700000+,但我只对范围(0,1)感兴趣。我如何绘制这些位,但是有很好的平滑曲线(这样一条曲线就不会中途停止)?
答案 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
)和此图:
答案 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()
答案 2 :(得分:2)
这个很容易:抱歉浪费时间。
只需通过
将y限制设置为[0,1]plt.ylim([0,1])
你已经完成了。