2

私は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()

ここに画像の説明を入力

4

2 に答える 2

4

私が提案する主な改善点は、Numpy の配列ブロードキャスト機能を使用することです。基本的に、これは配列全体に対して一度に数学演算を実行します。それ以外は、1 つの式で全体の大きさを計算できますが、コードに問題はありません。それがコードをより明確にするかどうかに応じて、それはあなたの呼び出しです。

# 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')
于 2013-04-28T00:48:17.083 に答える