2. Feladat

Egyszerű ábrázolás és Függvények - I.

Ebben a feladatban adott két lista, amely egy műveleti erősítős integráló RC-kör frekvenciafüggő átviteli erősítési adatit tartalmazza, a frekvenciaadatokat $\mathrm{Hz}$-ben, az átviteli arányt $\mathrm{V}/\mathrm{V}$-ban.

In [1]:
frekvencia=[50.23, 100, 200.5, 499.5, 1000, 1593, 2007, 5017, 10040, 20000, 49800]
atvitel=[30,15.55, 8.8889, 3.1136, 1.5454, 0.9773, 0.7674, 0.2954, 0.2272, 0.1704, 0.1363]

Vizsgáljuk a most már decibelre átszámolt átviteli arányt a frekvencia függvényében!

  • Először írjunk egy függvényt, ami lineáris interpolációt végez a két szomszédos adatpontból azok számtani közepénél!

A lineáris interpoláció algebrai függvénye (Y-t keressük, és X számtani közepe $x_1$ és $x_2$-nek): \begin{equation} Y=y_1+\frac{(X - x_1)\cdot (y_2 - y_1)}{(x_2 - x_1)} \end{equation}

  • Végül ábrázoljuk az eredményt (vízszintesen a frekvenciát (hertzben), függőlegesen az átviteli arányt (decibelben))! Az ábrán piros pontok jelenítsék meg az eredeti adatokat, míg kék "+" mutassa az interpolált adatokat.

Megoldás

Mivel ebben a feladatban a pylab több funkcióját használni fogjuk, először ezt töltsük be!

In [2]:
%pylab inline
Populating the interactive namespace from numpy and matplotlib

Feszültségarány esetén, a decibell értékének kiszámítási módja: $$20 \log_{10}{\left( \frac{U_{ki}}{U_{be}} \right)}$$ Mivel az atvitel lista az $\frac{U_{ki}}{U_{be}}$ értékeket tartalmazza, ezeknek csak venni kell a logaritmusuk 20-szorosát:

In [3]:
decibell = 20 * log10(atvitel)
decibell
Out[3]:
array([ 29.54242509,  23.83460787,  18.97696041,   9.86525637,
         3.78081816,  -0.19944202,  -2.2995641 , -10.59179018,
       -12.87183346, -15.37060819, -17.31008288])

Mivel a lineáris interpolációt a független változó számtani közepénél végezzük, ezért a képlet jelentősen egyszerűsödik: $$ Y = y_1 + \frac{\left( \frac{x_1 + x_2}{2} - x_1 \right) \cdot \left(y_2 - y_1\right)}{x_2 - x_1} = y_1 + \frac{\frac{1}{2} \left(x_2 - x_1\right) \cdot \left(y_2 - y_1\right)}{x_2 - x_1} = \frac{y_1 + y_2}{2} $$ Emiatt, a pol függvényt úgy kell beállítani, hogy $X$ az $x_1$ és $x_2$ változók, $Y$ pedig $y_1$ és $y_2$ változók számtani közepe legyen. Ez alapján az interpolációt végző függvény:

In [4]:
def pol(x1,x2,y1,y2):
    X = (x1 + x2)/2
    Y = (y1 + y2)/2
    return X, Y

Az interpoláció elvégzését for-ciklussal oldjuk meg:

In [5]:
ujfrekvencia = list()             
ujdecibell = list()                        # létrehozunk két üres listát, az új adatok számára
for i in range(0, len(frekvencia) - 1):    # Az egyes interpolálásokat for-ciklussal végezzük
    fr, db = pol(frekvencia[i], frekvencia[i+1], decibell[i], decibell[i+1]) # ideiglenesen az fr és a db változókba tesszük a kapott értékeket
    ujfrekvencia += [fr]                   # Majd ezeket hozzáadjuk a listához
    ujdecibell += [db]

Végül pedig a plot függvény segítségével ábrázoljuk mindkét adatsorozatot:

In [6]:
plot(frekvencia, decibell, 'rp')
plot(ujfrekvencia, ujdecibell, 'b+')
xlabel("frekvencia (Hz)")
ylabel("átvitel (dB)")
title("A feszültségerösítés a frekvencia függvényében")
legend(["a mért adatok", "a lineáris interpoláció"])
Out[6]:
<matplotlib.legend.Legend at 0x7f417d4e4860>