mpc/gpc_N.py
changeset 0 0efde00f9229
equal deleted inserted replaced
-1:000000000000 0:0efde00f9229
       
     1 #!/usr/bin/env python
       
     2 # 12.2
       
     3 
       
     4 import os, sys
       
     5 sys.path += [os.getcwdu() + os.sep + ".." + os.sep + "python"]
       
     6 
       
     7 import pylab as pl
       
     8 from xdync import xdync
       
     9 from polyfuncs import polmul
       
    10 
       
    11 def gpc_N(A, dA, B, dB, k, N1, N2, Nu, rho):
       
    12     D, dD = pl.array([1, -1]), 1
       
    13     AD, dAD = pl.convolve(A, D), dA+1
       
    14     zj, dzj = 1, 0
       
    15     for i in range(N1+k-1):
       
    16         zj = sp.convolve(zj, [0,1])
       
    17         dzj += 1
       
    18     G = pl.zeros((N2-N1+1, Nu+1))
       
    19     H1 = pl.zeros((N2-N1+1, k-1+dB))
       
    20     H2 = pl.zeros((N2-N1+1, dA+1))
       
    21 
       
    22     for j in range(k+N1, k+N2+1):
       
    23         zj = pl.convolve(zj, [0,1])
       
    24         dzj = dzj + 1
       
    25         Fj, dFj, Ej, dEj = xdync(zj, dzj, AD, dAD, 1, 0)[:4]
       
    26         Gj, dGj = polmul(B, dB, Ej, dEj)
       
    27         if j-k >= Nu:
       
    28             G[j-(k+N1),:Nu+1] = Gj[range(j-k, j-k-Nu-1, -1)]
       
    29         else:
       
    30             G[j-(k+N1),:j-k+1] = Gj[j-k::-1]
       
    31         H1[j-(k+N1),:k-1+dB] = Gj[j-k+1:j+dB]
       
    32         H2[j-(k+N1),:dA+1] = Fj
       
    33     K = pl.dot(pl.inv(pl.dot(G.T, G) + rho*pl.eye(Nu+1, Nu+1)), G.T)
       
    34     KH1 = pl.dot(K, H1)
       
    35     KH2 = pl.dot(K, H2)
       
    36     R1 = pl.concatenate(([1], KH1[0,:]))
       
    37     dR1 = len(R1)-1
       
    38     Sc = KH2[0,:]
       
    39     dSc = len(Sc)-1;
       
    40     Tc = K[0,:]
       
    41     dTc = len(Tc)-1;
       
    42         
       
    43     return K,KH1,KH2,Tc,dTc,Sc,dSc,R1,dR1