【问题标题】:algebraic expressions in pythonpython中的代数表达式
【发布时间】:2013-04-28 00:34:29
【问题描述】:

我在 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()

【问题讨论】:

    标签: python plot algebra


    【解决方案1】:

    我建议的主要改进是使用 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')
    

    【讨论】:

    • 谢谢大卫,是的,“数组广播”要好得多——我不知道 python/numpy 可以做到这一点。
    • (w*L - 1/(w*C)) 可以被分解出来。
    【解决方案2】:

    您也可以使用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⎠  │
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多