notatki

  • tworzenie slajdów komendą
  • jupyter nbconvert .\Prezentacja.ipynb --TagRemovePreprocessor.remove_input_tags="{'remove_input'}" --to slides
  • nastepny kod służy do modyfiacji CCS dopasowywujacego prezentacje slajdową
In [8]:
from IPython.display import display, HTML


HTML("""
<style>
.reveal {
    background-image: url('back.jpg');
    background-size: cover;
    background-repeat: no-repeat;
    background-attachment: fixed;
    color: white  !important;
}
     
h1, h2, h3, h4 ,p ,li {
    color: white !important; /* Kolor nagłówków */
}
          
.reveal  .navigate-left, .reveal .navigate-right, .reveal .navigate-up, .reveal .navigate-down {
    color: #ff0000 !important; /* Czerwony kolor strzałki */
    fill: white !important;   /* Wymusza zmianę koloru SVG */ 
}

.reveal .footer {
    position: fixed;
    bottom: 10px; /* Odległość od dołu */
    left: 0;
    right: 0;
    text-align: left;
    font-size: 14px; /* Rozmiar tekstu */
    color: white; /* Kolor tekstu */
    background-color: rgba(255, 255, 255, 0.8); /* Przezroczyste tło */
    padding: 5px; /* Margines wewnętrzny */
    z-index: 10; /* Nad innymi elementami */
    color: red;
}
     

:root {     
    --jp-content-font-color0: yelow;
    --jp-content-font-color1: yelow;
}    

</style>

<div class="footer">
    Alekssander Data 2024
</div>     
     

""")
Out[8]:
Alekssander Data 2024

Język Python jako środowisko pomiarowe, symulacyjne, analizy danych i prezentacji¶

  • Dlaczego Python¶

  • Środowisko pomiarowe¶

  • Symulacje¶

  • Analiza danych, prezentacje i publikacje wyników¶

  • Podsumowanie¶

Dlaczego Python¶

  • Uniwersalny¶

  • Przetestowany, ma już ponad 30 lat¶

  • Jest interpreterem¶

  • Popularny, mnóstwo bibliotek¶

Środowisko pomiarowe¶

  • Podłączanie za pomocą interfejsu VISA LabView i biblioteki PyVISA¶

  • Praktycznie każdy sprzęt da się kontrolować.¶

  • Automatyzacja procesu¶

  • Szybkość¶

  • Dokładność¶

  • Eliminacja subiektywnej oceny człowieka¶

  • Łatwość przechowywania danych, praktycznie w nieograniczonej liczbie.¶

  • Bieżąca analiza i weryfikacja¶

Przykład pomiarów: charakterystyka izotermiczna tranzystora¶

image

Przykład pomiaru charakterystyki nieizotermicznej tranzystora¶

image

Przykład danych pobieranych z oscyloskopu¶

In [9]:
import pandas as pd
import plotly.express as px
df = pd.read_csv('data/keyosc_wykres.csv', sep = ';', decimal = '.',  index_col=0)
fig = px.line(df, width=750, height=550)
fig.write_html('_osc.html')
fig.show()

Symulacje układów elektronicznych narzędziem NGSpice¶

wykres interaktywny

Biblioteka posiada wiele popularnych i zdefiniowancyh elementów. Bez problemu możemy sobie również zdefiniować swój własny element, podajęc jego parametry.

In [10]:
import numpy as np
import plotly.express as px
import pandas as pd
from PySpice.Doc.ExampleTools import find_libraries
from PySpice.Spice.Netlist import Circuit
from PySpice.Spice.Library import SpiceLibrary
from PySpice.Unit import *

circuit = Circuit('U(I)')

source = circuit.V('input', 'in_', circuit.gnd, 3)# 10@u_V)

circuit.model(  name='1N4007', modele_type='D',
                IS=7.02767@u_nA,    RS=0.0341512,   N=1.80803,  EG=1.05743, 
                XTI=5,              BV=1000,        IBV=5e-08,  CJO=1e-11, 
                VJ=0.7,             M=0.5,          FC=0.5,     TT=1e-07
            )
circuit.Diode(1, 'in_', circuit.gnd, model = '1N4007')
Vin = slice(0.4, 1.2, 0.01)
df = pd.DataFrame()
temperatures = [25@u_Degree, 50@u_Degree, 75@u_Degree, 100@u_Degree, 125@u_Degree, 150@u_Degree, 175@u_Degree]
analyses = {}
for temperature in temperatures:
    simulator = circuit.simulator(temperature=temperature)#, nominal_temperature=temperature)
    analysis = simulator.dc(Vinput=Vin)
    ser = pd.Series(data=-analysis.Vinput, index=analysis.in_, name=f'{temperature}')
    df = pd.concat([df, ser.to_frame()])

df.index.name = 'V'
fig = px.line(df, title='Charakterystyka diody 1N4007', width=750, height=550)
fig.update_yaxes(title='I')
fig.write_html('_dioda.html')
#fig.show()
Unsupported Ngspice version 41

Symulacja: Aproksymacja parametrów modelu metodą genetyczną¶

Dodatkowa fukcjonalność modułu symulacyjnego PySpice¶

Możliwość przyporządkowanie jednostki miary. Program sam dokona konwersji jednostki w zależności od działania.

In [11]:
from PySpice.Unit import *

i = 2@u_A
v = 5@u_V
p = i*v

print(f'{i} * {v} = {p}')

s = 8@u_m
t = 2@u_s
v = s/t
a = v/t
print(f'{s} / {t} = {v}')
print(f'{v} / {t} = {a}')
2 A * 5 V = 10.0 W
8 m / 2 s = 4.0 m*s^-1
4.0 m*s^-1 / 2 s = 2.0 m*s^-2

Analiza danych, prezentacje i publikacje wyników¶

  • Porównywanie wyników pomiarowych i symulacyjnych¶

  • Analiza wyników¶

    • różne metody obliczeniowe, np. algorytm genetyczny¶

    • głębokie uczenie, dostęp do silnika TensorFlow¶

    • współpraca automatyczna (API) z innymi serwisami internetowymi¶

  • Przedstawienie wyników w celu konsultacji¶

  • Publikacje wyników¶

Przykład: porównanie charakterystyk trzech tranzystorów¶

wykres interaktywny
In [12]:
from fileinput import filename
from operator import index
from tracemalloc import stop
from xml.dom.expatbuilder import TEXT_NODE
import numpy as np
import pandas as pd
import plotly.graph_objects as go


tranzystors = ["A(TP65H035WSQA)", "B(GAN063-560WSA)", "C(TP60H050WS)"]
colorscales = ['Viridis','RdBu', 'YlOrRd' ]

t_start = -50
t_end   = 150
t_step = 5

t_a_s = range(t_start, t_end, t_step)

typ = 1 # 1-przejściowa 0-wyjściowa

if typ:
    pomiar = "Przejściowa Uds"
    c_i = 11 # 11 dla Uds = 1V
else:
    pomiar = "Wyjściowa Ugs"
    c_i = 6 # 6 dla Ugs = 5V


surfaces = []

for tranzystor in tranzystors:
    t_a = t_start
    # do budowy indeksu 
    # wskazany wskazane konkretne pliki z indeksami w pierwszej kolumnie
    # z powodu pomyłki niektóre pliki csv nie mają indeksu 
    #fn = f"data\{pomiar}-A(TP65H035WSQA)-Ta{t_a:.0f}.csv"
    fn = f"data\{pomiar}-B(GAN063-560WSA)-Ta30.csv"
    #print("Odczytałem plik {}".format(fn))
    ds = pd.read_csv(fn, sep = ';', decimal = '.', index_col = 0)
    df = pd.DataFrame(index=ds.index.values)
    cn = list(ds.columns.values)[c_i-1]
    df = df.sort_index()
    for t_a in t_a_s:
        fn = f"data\{pomiar}-{tranzystor}-Ta{t_a:.0f}.csv"
        try:
            ds = pd.read_csv(fn, sep = ';', decimal = '.')
            #print("Odczytałem plik {}".format(fn))
            cn_ = "$T_a={:.0f}°C$".format(t_a)
            seria = ds[cn].values
            df.insert(len(df.columns),  cn_, seria, True)
        except:
            seria = None #pd.Series(None, name='"$T_a={:.0f}°C$".format(t_a)')
            seria.fill(None)
            df = pd.concat([df, ds[cn]],ignore_index=True)

    x = t_a_s
    y = df.index

    X, Y = np.meshgrid(x, y)
    Z = np.zeros([len(y), len(x)])

    for ix in range(0, len(x)):
        for iy in range (0, len(y)):
            Z[iy,ix] = df.iloc[iy, ix]

    xl=len(x)
    yl=len(y)
    surface = go.Surface(z=Z, x=X, y=Y, 
                         colorscale=colorscales[tranzystors.index(tranzystor)], 
                         name=tranzystor, showlegend=True, showscale=False)
    surfaces.append(surface)

fig = go.Figure(data=surfaces)

# Ustawienia osi i widoczności legendy
fig.update_layout(
    scene=dict(
        xaxis_title='Ta [°C]',
        yaxis_title='Ugs [V]',
        zaxis_title='Id [V]'
    ),
    showlegend=True,  # Włączenie legendy
    title="Tranzystory",
    width=750,  
    height=550 
)

fig.write_html('_3tra.html')
fig.show()

Przykład analizy matematycznej i operacji symbolicznych¶

In [13]:
import sympy as sp
a, b, c, x = sp.symbols('a b c x')
fy = a*x**3+b*x**2+c
display(sp.Eq(sp.Derivative(fy,x), sp.Derivative(fy,x, evaluate=True), evaluate=False))
display(sp.Eq(sp.Derivative(fy,x,x), sp.Derivative(fy,x,x, evaluate=True), evaluate=False))
$\displaystyle \frac{\partial}{\partial x} \left(a x^{3} + b x^{2} + c\right) = 3 a x^{2} + 2 b x$
$\displaystyle \frac{\partial^{2}}{\partial x^{2}} \left(a x^{3} + b x^{2} + c\right) = 2 \left(3 a x + b\right)$

Przykład obliczeń numerycznych na podstawie poprzedniej funkcji¶

wykres interaktywny
In [14]:
import numpy as np
import plotly.express as px
vx = np.linspace(-4, 4, 100)
fy = fy.subs({(a,2), (b,3), (c,4)})
dfy = sp.Derivative(fy,x, evaluate=True)
vy = []
vdy = []
for x_ in vx:
    vy.append(float(fy.subs(x, x_).evalf()))
    vdy.append(float(dfy.subs(x, x_).evalf()))

import pandas as pd
data = {fy: vy,
        dfy: vdy}
df = pd.DataFrame(data=data, index=vx)
fig = px.line(df, width=750, height=550)

fig.update_layout(
    title=r'Wykres funkcji i pochodnej',
    xaxis_title=r'X',
    yaxis_title=r'Y',
)
fig.write_html('_poch.html')
fig.show()

Całki¶

In [15]:
y = (x**2+5*x)*sp.exp(x)
integ = sp.Integral(y, x)
display(sp.Eq(integ, integ.doit(), evaluate=False))
integ = sp.Integral(y, (x, 0,2))
display(sp.Eq(integ, integ.doit(), evaluate=False))
y = sp.exp(-x)
integ = sp.Integral(y, (x, 0, sp.oo))
display(sp.Eq(integ, integ.doit(), evaluate=False))
$\displaystyle \int \left(x^{2} + 5 x\right) e^{x}\, dx = \left(x^{2} + 3 x - 3\right) e^{x}$
$\displaystyle \int\limits_{0}^{2} \left(x^{2} + 5 x\right) e^{x}\, dx = 3 + 7 e^{2}$
$\displaystyle \int\limits_{0}^{\infty} e^{- x}\, dx = 1$

Macierze, tensory¶

'Einstein tensor'
$\displaystyle \left[\begin{matrix}- \frac{M^{2}}{r^{4}} - \frac{M^{2} \left(- 2 M + r\right)^{2}}{r^{6} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r^{3}} - \frac{M \left(- 2 M + r\right)}{r^{4}} - \left(\frac{2 M}{r} - 1\right) \left(- \frac{r \left(- \frac{M^{2}}{r^{4}} - \frac{M^{2} \left(- 2 M + r\right)^{2}}{r^{6} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r^{3}} - \frac{M \left(- 2 M + r\right)}{r^{4}}\right)}{2 \left(- 2 M + r\right)} + \frac{\left(- 2 M + r\right) \left(- \frac{M^{2}}{r^{2} \left(- 2 M + r\right)^{2}} - \frac{M^{2}}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r \left(- 2 M + r\right)^{2}} + \frac{M}{r^{2} \left(- 2 M + r\right)} - \frac{2 M \left(- 2 M + r\right)}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}}\right)}{2 r} + \frac{- \frac{M \sin^{2}{\left(\theta \right)}}{r} + \frac{M \left(- 2 M + r\right)^{2} \sin^{2}{\left(\theta \right)}}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2} \sin^{2}{\left(\theta \right)}} + \frac{\frac{M \left(2 M - r\right)}{r \left(- 2 M + r\right)} - \frac{M \left(- 2 M + r\right) \left(2 M - r\right)}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2}}\right) & 0 & 0 & 0\\0 & - \frac{M^{2}}{r^{2} \left(- 2 M + r\right)^{2}} - \frac{M^{2}}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r \left(- 2 M + r\right)^{2}} + \frac{M}{r^{2} \left(- 2 M + r\right)} - \frac{2 M \left(- 2 M + r\right)}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} - \frac{- \frac{r \left(- \frac{M^{2}}{r^{4}} - \frac{M^{2} \left(- 2 M + r\right)^{2}}{r^{6} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r^{3}} - \frac{M \left(- 2 M + r\right)}{r^{4}}\right)}{2 \left(- 2 M + r\right)} + \frac{\left(- 2 M + r\right) \left(- \frac{M^{2}}{r^{2} \left(- 2 M + r\right)^{2}} - \frac{M^{2}}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r \left(- 2 M + r\right)^{2}} + \frac{M}{r^{2} \left(- 2 M + r\right)} - \frac{2 M \left(- 2 M + r\right)}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}}\right)}{2 r} + \frac{- \frac{M \sin^{2}{\left(\theta \right)}}{r} + \frac{M \left(- 2 M + r\right)^{2} \sin^{2}{\left(\theta \right)}}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2} \sin^{2}{\left(\theta \right)}} + \frac{\frac{M \left(2 M - r\right)}{r \left(- 2 M + r\right)} - \frac{M \left(- 2 M + r\right) \left(2 M - r\right)}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2}}}{- \frac{2 M}{r} + 1} & 0 & 0\\0 & 0 & \frac{M \left(2 M - r\right)}{r \left(- 2 M + r\right)} - \frac{M \left(- 2 M + r\right) \left(2 M - r\right)}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}} - r^{2} \left(- \frac{r \left(- \frac{M^{2}}{r^{4}} - \frac{M^{2} \left(- 2 M + r\right)^{2}}{r^{6} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r^{3}} - \frac{M \left(- 2 M + r\right)}{r^{4}}\right)}{2 \left(- 2 M + r\right)} + \frac{\left(- 2 M + r\right) \left(- \frac{M^{2}}{r^{2} \left(- 2 M + r\right)^{2}} - \frac{M^{2}}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r \left(- 2 M + r\right)^{2}} + \frac{M}{r^{2} \left(- 2 M + r\right)} - \frac{2 M \left(- 2 M + r\right)}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}}\right)}{2 r} + \frac{- \frac{M \sin^{2}{\left(\theta \right)}}{r} + \frac{M \left(- 2 M + r\right)^{2} \sin^{2}{\left(\theta \right)}}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2} \sin^{2}{\left(\theta \right)}} + \frac{\frac{M \left(2 M - r\right)}{r \left(- 2 M + r\right)} - \frac{M \left(- 2 M + r\right) \left(2 M - r\right)}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2}}\right) & 0\\0 & 0 & 0 & - \frac{M \sin^{2}{\left(\theta \right)}}{r} + \frac{M \left(- 2 M + r\right)^{2} \sin^{2}{\left(\theta \right)}}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}} - r^{2} \left(- \frac{r \left(- \frac{M^{2}}{r^{4}} - \frac{M^{2} \left(- 2 M + r\right)^{2}}{r^{6} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r^{3}} - \frac{M \left(- 2 M + r\right)}{r^{4}}\right)}{2 \left(- 2 M + r\right)} + \frac{\left(- 2 M + r\right) \left(- \frac{M^{2}}{r^{2} \left(- 2 M + r\right)^{2}} - \frac{M^{2}}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}} + \frac{M}{r \left(- 2 M + r\right)^{2}} + \frac{M}{r^{2} \left(- 2 M + r\right)} - \frac{2 M \left(- 2 M + r\right)}{r^{4} \left(- \frac{2 M}{r} + 1\right)^{2}}\right)}{2 r} + \frac{- \frac{M \sin^{2}{\left(\theta \right)}}{r} + \frac{M \left(- 2 M + r\right)^{2} \sin^{2}{\left(\theta \right)}}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2} \sin^{2}{\left(\theta \right)}} + \frac{\frac{M \left(2 M - r\right)}{r \left(- 2 M + r\right)} - \frac{M \left(- 2 M + r\right) \left(2 M - r\right)}{r^{3} \left(- \frac{2 M}{r} + 1\right)^{2}}}{2 r^{2}}\right) \sin^{2}{\left(\theta \right)}\end{matrix}\right]$

Podsumowanie¶

  • Wszystko pod kontrolą jednego środowiska¶

  • Umożliwa szybkie wykonanie prezentacji z bieżących danych¶

  • Praktycznie nieograniczone i darmowe możliwości¶

  • Wszystko na zasadach otwartego oprogramowania (Open Source)¶

  • Naturalnym systemem dla tego środowiska jest Linux¶

Dziękuję za uwagę¶

Aleksander Data¶

Prezentacja jest dostępna na stronie olekdata.pl/python¶