Sisällysluettelo

In [1]:
import pylab as plt
#from math import sin, cos 
#import datetime
#import time
import json
from opt_params import par
from opt_dfuns import uopt, xy_load, v_kuorma

Apufunktio kuorman siirron aikana käytetyn energian laskemiseksi. pp1 on vaunun moottorin ja pp2 on nostomoottorin teho kullakin ajanhetkellä. Koska aikaväli on 1/48 s., energia eli tehty työ saadaan jakamalla 48:lla. (Tämä on tietysti vain approksimaatio. )

In [2]:
def energia(pp):
    E = 0
    for p in pp:
        E = E + p
    E = E/48.0
    # print("energia: ", E)
    return E

Piirtokomennot kopioin valmiista esimerkeistä. Google osaa selittää tarkemmin, mitä ne tekevät. Perusfilosofia on se, että kukin komento täydentää kuvaa, kunnes se piirretään show()-komennolla tai tallenetaan tiedostoon savefig-komennolla.

'_{0:0>2d}.png'.format(n_iter) on hyvä esimerkki merkkijonojen formatoinnista. Halusin tallentaa kuvaajat tiedostoon, jonka nimi päättyy "_.png" Oletusarvoisesti kokonaisluku tulostuu monen numeron tarkkuudella, mutta tässä riittää 2 numeroa. Lisäksi halusin tiedostojen asettuvan aakkosjärjestyksessä oikein, eli halusin yksinumeroisten lukujen eteen 0:n, 1 -> 01. Kannattaa perehtyä pythonin format-käskyyn, jos esimerkiksi numeroiden esitystapa on tulostuksessa tärkeä.

In [4]:
# Piirretaan ratkaisu ajan funktiona
def opt_nosturi_piirto(s_paiva, n_iter, x, y, dim):
    sysdim = 2 * par.sysdim
    labels = [
        'vaunun nopeus', 'vaijerin kulman muutosnopeus',
        'vaijerin pituuden muutosnopeus', 'vaunun paikka', 'vaijerin kulma',
        'vaijerin pituus', 'vaunua vetava voima', 'kuormaa nostava voima',
        'vaijerin venyma', 'lt1', 'lt2', 'lt3', 'lt4', 'lt5', 'lt6'
    ]

    # tulostetaan liittotilojen kuvaajat
    g, gxarr = plt.subplots(2, 3, figsize=(14, 8))
    for i in range(0, 2):
        for j in range(0, 3):
            gxarr[i, j].plot(x, y[6 + j + 3 * i, :], '-')
            gxarr[i, j].set_title(labels[9 + j + 3 * i])
    PlotNameLamdat = 'plots/lamdat_' + s_paiva + '_{0:0>2d}.png'.format(n_iter)
    plt.savefig(PlotNameLamdat)
    plt.show()

    # tilamuuttujien, ohjausten ja tehojen kuvaajat
    f, axarr = plt.subplots(4, 3, figsize=(14, 10))
    for i in range(0, 2):
        for j in range(0, 3):
            axarr[i, j].plot(x, y[j + 3 * i, :], '-')
            axarr[i, j].set_title(labels[j + 3 * i])
            axarr[i, j].grid(True)
    uu1 = [0 for i in range(dim)]
    uu2 = [0 for i in range(dim)]
    vv_krm = [0 for i in range(dim)]
    f0 = [par.g * par.M_load for i in range(dim)]
    teho1 = [0 for i in range(dim)]
    teho2 = [0 for i in range(dim)]
    tehot = [0 for i in range(dim)]
    for j in range(0, dim):
        [u1, u2] = uopt(y[:, j])
        vv_krm[j] = v_kuorma(y[:, j])
        teho1[j] = u1 * y[0, j]
        teho2[j] = -u2 * y[2, j]
        tehot[j] = teho1[j] + teho2[j]
        uu1[j] = u1
        uu2[j] = u2
    axarr[2, 0].plot(x, uu1)
    axarr[2, 0].set_title(labels[sysdim])
    axarr[2, 0].grid(True)
    axarr[2, 1].set_title(labels[sysdim + 1])
    axarr[2, 1].plot(x, uu2)
    axarr[2, 1].plot(x, f0, '--')
    axarr[2, 1].set_title(labels[sysdim + 1])
    axarr[2, 1].grid(True)
    axarr[2, 2].plot(x, teho1, 'b-', label='vaunu')
    axarr[2, 2].plot(x, teho2, 'g-', label='kuorma')
    axarr[2, 2].set_title('tehot')
    axarr[2, 2].legend(loc='lower left', ncol=2)
    axarr[2, 2].grid(True)
    axarr[3, 0].plot(x, vv_krm, '-')
    axarr[3, 0].set_title('kuorman nopeus')
    axarr[3, 0].grid(True)
    axarr[3, 2].plot(x, tehot, '-')
    axarr[3, 2].set_title('summateho')
    info = "energia: {0:.4g}".format(energia(tehot))
    axarr[3, 2].text(1.0, 0.0, info)
    axarr[3, 2].grid(True)
    PlotNameTilat = 'plots/tilat_' + s_paiva + '_{0:0>2d}.png'.format(n_iter)
    plt.savefig(PlotNameTilat)
    plt.ion()
    plt.show()

    # Järjestelmän "asento" eri ajan hetkinä
    plt.figure(figsize=(14, 10))
    for j in range(0, dim):
        [x_load, y_load] = xy_load(y[:, j])
        x_car = y[3, j]
        plt.plot([x_car, x_load], [0.0, y_load])
    PlotName_xy = 'plots/xya_' + s_paiva + '_{0:0>2d}.png'.format(n_iter)
    plt.savefig(PlotName_xy)
    plt.show


# Tallenetaan kunkin ajanhetken ohjausvoimat tiedostoon, 
#josta nosturipeli voi ne lukea
def tallenna_ohjaus(x, y, dim):
    uu = [0.0 for i in range(dim)]
    for j in range(0, dim):
        uu[j] = uopt(y[:, j])
    # json on yleinen kätevä rakenteisen tiedon tallennusmuoto
    with open('uopt.dat', 'w') as fil:
        json.dump(uu, fil)