[英]algebraic expressions in python
我正在使用python中的一些相對簡單的代數表達式,想知道是否有比我目前正在做的更好的方式來繪制代數表達式:
我有一個陷波濾波器的方程式(下圖-一本書的左側;右側圖是我的代碼生成的無花果),到目前為止,我的代碼雖然粗略。
有更好的方法來繪制幅度嗎? 如圖所示,常數是; R = 50.0,C = 470e-12,L = 54e-6,所需的頻率范圍是0至2MHz。
import matplotlib.pyplot as plt
import numpy as np
import math
R = 50.0
C = 470e-12
L = 54e-6
FREQ = []
DATA = []
for i in range(1, 200):
f = i*10000.0
w = 2*np.pi*f
Ztop = w*L - 1.0/(w*C)
Zbot = math.sqrt( (math.pow(R,2) + math.pow((w*L) -(1.0/(w*C)),2)) )
Zout = abs(Ztop / Zbot)
FREQ.append( f/1e6 )
DATA.append( Zout )
plt.figure(1)
plt.plot(FREQ,DATA, '-k')
plt.xlabel('Frequency (MHz)')
plt.ylabel('Mag.')
plt.grid()
plt.show()
我建議的主要改進是使用Numpy的陣列廣播設施。 基本上,這將立即對整個陣列執行數學運算。 除此之外,您的代碼沒有什么問題 ,盡管您可以在一個表達式中計算整個幅度。 這就是您的要求,具體取決於您是否認為這樣可以使代碼更清晰。
# creates 201 values evenly spaced from 0 to 2e6, inclusive
f = np.linspace(0, 2e6, 201)
w = 2 * np.pi * f
# now calculate the magnitude for all 201 values at once
magnitude = (w * L - 1 / (w * C)) / np.sqrt(R**2 + (w * L - 1 / (w * C))**2)
# now you can plot magnitude vs. frequency
plt.plot(f / 1e6, magnitude, '-k')
您還可以使用sympy
繪制符號表達式:
from __future__ import division
from sympy import pi, pprint, sqrt, symbols # $ pip install sympy
from sympy.plotting import plot
f = symbols("f")
L, C, R = symbols("L, C, R", real=True)
w = 2*pi*f
W = w * L - 1 / (w * C)
mag = abs(W / sqrt(R**2 + W**2))
pprint(mag)
plot(mag.subs({R: 50.0, C: 470e-12, L: 54e-6}), (f, 1, 2e6))
│ 1 │
│ 2⋅π⋅L⋅f - ─────── │
│ 2⋅π⋅C⋅f │
│────────────────────────────────│
│ ___________________________│
│ ╱ 2 │
│ ╱ 2 ⎛ 1 ⎞ │
│ ╱ R + ⎜2⋅π⋅L⋅f - ───────⎟ │
│╲╱ ⎝ 2⋅π⋅C⋅f⎠ │
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.