如何在 python 中制作衰减振荡函数?
How do I make a decaying oscilating function in python?
我在 python 中有一个代码来表示阻尼振荡器中的能量衰减,它是这样写的:
def E(wt, Q):
return (np.e**(-x/Q))*(1-(1/2*Q)*np.sin(2*x))
x = np.linspace(0,20,1000)
y0 = E(x,2)
y1 = E(x,4)
y2 = E(x,8)
y3 = E(x,16)
plt.plot(x, y0, 'p', label=r'$Q=2$')
plt.plot(x, y1, 'r', label=r'$Q=4$')
plt.plot(x, y2, 'g', label=r'$Q=8$')
plt.plot(x, y3, 'b', label=r'$Q=16$')
plt.xlabel(r'$wt$')
plt.ylabel(r'$E$')
plt.title (r"$E(t) -vs.- wt$")
plt.show()
但它应该是这样的:
https://www.dropbox.com/s/o2mmmi8v6kdnn2v/good_graph.png?dl=0
我究竟做错了什么?我有正确的功能
固定方程
def E(wt, Q):
return np.exp(-x/float(Q)) * ( 1. - (1./2./float(Q))*np.sin(2.* x) )
你的原始方程
def E(wt, Q):
return (np.e**(-x/Q))*(1-(1/2*Q)*np.sin(2*x))
错误
- 未使用的变量你从不使用
wt
- BODMAS你没有正确设置衰减参数,所以它会振荡太多。
(1/2*Q)
当你的意思是 (1/2/Q)
- 整数除法 (仅适用于 Python < 3) 您除以整数,这将降低您的除法。您需要将整数值转换为浮点数,例如
(1/2./float(Q))
- 颜色参数 你想通过在
plt.plot(x, y0, 'p', label=r'$Q=2$')
中传递 p
来制作一条紫色线,但是 p
会产生奇怪的点图行为。要在颜色名称中明确修复此通道,例如plt.plot(x, y0, color='purple', label=r'$Q=2$')
题外话
为了使您的标题更好看:
from matplotlib import rc
rc('font', **{'family': 'serif', 'serif': ['Computer Modern']})
rc('text', usetex=True)
plt.title (r"$E(t)$ vs. $w_t$")
plt.xlabel(r'$w_t$')
plt.ylabel(r'$E(t)$')
完整代码
from matplotlib import rc
import bumpy as np
import matplotlib.pyplot as plot
# set up fonts
rc('font', **{'family': 'serif', 'serif': ['Computer Modern']})
rc('text', usetex=True)
# set up labels
plt.title (r"$E(t)$ vs. $w_t$")
plt.xlabel(r'$w_t$')
plt.ylabel(r'$E(t)$')
# plot and store plots in yList, zip color labels into loop
yList = []
for i,color in zip(xrange(1,5),['purple', 'r', 'g', 'b']):
y = E(x, 2**i)
yList.append(y)
plt.plot(x, y, color = color, label= r'$Q=%s$' % i)
pt.show()
功能好像不太对。我怀疑原来的公式是正确的,但你没有在 Python.
中正确编码
import numpy as np
import pylab as plt
def E(x, Q):
return np.exp(-x/Q) * (1-(1.0/2.0/Q) * np.sin(2*x))
def main():
x = np.linspace(0,20,1000)
y0 = E(x,2)
y1 = E(x,4)
y2 = E(x,8)
y3 = E(x,16)
plt.plot(x, y0, 'p', label=r'$Q=2$')
plt.plot(x, y1, 'r', label=r'$Q=4$')
plt.plot(x, y2, 'g', label=r'$Q=8$')
plt.plot(x, y3, 'b', label=r'$Q=16$')
plt.xlabel(r'$wt$')
plt.ylabel(r'$E$')
plt.title (r"$E(t) -vs.- wt$")
plt.show()
return 0
if __name__ == '__main__':
main()*
我在 python 中有一个代码来表示阻尼振荡器中的能量衰减,它是这样写的:
def E(wt, Q):
return (np.e**(-x/Q))*(1-(1/2*Q)*np.sin(2*x))
x = np.linspace(0,20,1000)
y0 = E(x,2)
y1 = E(x,4)
y2 = E(x,8)
y3 = E(x,16)
plt.plot(x, y0, 'p', label=r'$Q=2$')
plt.plot(x, y1, 'r', label=r'$Q=4$')
plt.plot(x, y2, 'g', label=r'$Q=8$')
plt.plot(x, y3, 'b', label=r'$Q=16$')
plt.xlabel(r'$wt$')
plt.ylabel(r'$E$')
plt.title (r"$E(t) -vs.- wt$")
plt.show()
但它应该是这样的: https://www.dropbox.com/s/o2mmmi8v6kdnn2v/good_graph.png?dl=0 我究竟做错了什么?我有正确的功能
固定方程
def E(wt, Q):
return np.exp(-x/float(Q)) * ( 1. - (1./2./float(Q))*np.sin(2.* x) )
你的原始方程
def E(wt, Q):
return (np.e**(-x/Q))*(1-(1/2*Q)*np.sin(2*x))
错误
- 未使用的变量你从不使用
wt
- BODMAS你没有正确设置衰减参数,所以它会振荡太多。
(1/2*Q)
当你的意思是(1/2/Q)
- 整数除法 (仅适用于 Python < 3) 您除以整数,这将降低您的除法。您需要将整数值转换为浮点数,例如
(1/2./float(Q))
- 颜色参数 你想通过在
plt.plot(x, y0, 'p', label=r'$Q=2$')
中传递p
来制作一条紫色线,但是p
会产生奇怪的点图行为。要在颜色名称中明确修复此通道,例如plt.plot(x, y0, color='purple', label=r'$Q=2$')
题外话
为了使您的标题更好看:
from matplotlib import rc
rc('font', **{'family': 'serif', 'serif': ['Computer Modern']})
rc('text', usetex=True)
plt.title (r"$E(t)$ vs. $w_t$")
plt.xlabel(r'$w_t$')
plt.ylabel(r'$E(t)$')
完整代码
from matplotlib import rc
import bumpy as np
import matplotlib.pyplot as plot
# set up fonts
rc('font', **{'family': 'serif', 'serif': ['Computer Modern']})
rc('text', usetex=True)
# set up labels
plt.title (r"$E(t)$ vs. $w_t$")
plt.xlabel(r'$w_t$')
plt.ylabel(r'$E(t)$')
# plot and store plots in yList, zip color labels into loop
yList = []
for i,color in zip(xrange(1,5),['purple', 'r', 'g', 'b']):
y = E(x, 2**i)
yList.append(y)
plt.plot(x, y, color = color, label= r'$Q=%s$' % i)
pt.show()
功能好像不太对。我怀疑原来的公式是正确的,但你没有在 Python.
中正确编码import numpy as np
import pylab as plt
def E(x, Q):
return np.exp(-x/Q) * (1-(1.0/2.0/Q) * np.sin(2*x))
def main():
x = np.linspace(0,20,1000)
y0 = E(x,2)
y1 = E(x,4)
y2 = E(x,8)
y3 = E(x,16)
plt.plot(x, y0, 'p', label=r'$Q=2$')
plt.plot(x, y1, 'r', label=r'$Q=4$')
plt.plot(x, y2, 'g', label=r'$Q=8$')
plt.plot(x, y3, 'b', label=r'$Q=16$')
plt.xlabel(r'$wt$')
plt.ylabel(r'$E$')
plt.title (r"$E(t) -vs.- wt$")
plt.show()
return 0
if __name__ == '__main__':
main()*