I'm having trouble giving the right input to the scipy.signal.dlsim
method.
The method requires the 4 state space matrices:
A = np.array([
[0.9056, -0.1908, 0.0348, 0.0880],
[0.0973, 0.8728, 0.4091, -0.0027],
[0.0068, -0.1694, 0.9729, -0.6131],
[-0.0264, 0.0014, 0.1094, 0.6551]
])
B = np.array([
[0, -0.0003, -0.0330, -0.0042, -0.0037],
[0, -0.0005, 0.0513, -0.0869, -0.1812],
[0, 0.0003, -0.0732, 1.1768, -1.1799],
[0, -0.0002, -0.0008, 0.2821, -0.4797]
])
C = np.array([-0.01394, -0.0941, 0.0564, 0.0435])
D = np.array([0, 0.0004, -0.0055, 0.3326, 0.5383])
and an input vector which I build in the following way:
inputs = np.array([
data['input1'].values(),
data['input2'].values(),
data['input3'].values(),
data['input4'].values(),
data['input5'].values()
])
This creates an inputs matrix with (5x752)
dimensions (I have 752 data points). So I take the transpose of the inputs matrix to preprocess my data:
inputs = np.transpose(inputs)
The inputs matrix now has the (752x5)
dimensions I presume are necessary for the simulation algorithm of scipy.
When I execute the method, I get the following error:
110 # Simulate the system
111 for i in range(0, out_samples - 1):
--> 112 xout[i+1,:] = np.dot(a, xout[i,:]) + np.dot(b, u_dt[i,:])
113 yout[i,:] = np.dot(c, xout[i,:]) + np.dot(d, u_dt[i,:])
114
ValueError: shapes (4,5) and (1,5) not aligned: 5 (dim 1) != 1 (dim 0)
I understand scipy is unable to make this multiplication but I do not know in which format I should give my inputs array to the method. If I would not transpose the matrix the dimensions would be even worse (1x752).
Am I missing something here?
This function returns the dot product of two arrays. For 2-D vectors, it is the equivalent to matrix multiplication. For 1-D arrays, it is the inner product of the vectors. For N-dimensional arrays, it is a sum product over the last axis of a and the second-last axis of b.
In Mathematics/Physics, dimension or dimensionality is informally defined as the minimum number of coordinates needed to specify any point within a space. But in Numpy, according to the numpy doc, it's the same as axis/axes: In Numpy dimensions are called axes. The number of axes is rank.
The matmul() function broadcasts the array like a stack of matrices as elements residing in the last two indexes, respectively. The numpy. dot() function, on the other hand, performs multiplication as the sum of products over the last axis of the first array and the second-to-last of the second.
Because np. dot executes the actual arithmetic operations and the enclosing loop in compiled code, which is much faster than the Python interpreter.
The numpy.dot()
method works separately for a matrix and an array. I converted the array somewhere to a matrix to be able to easily read the dimensions which caused this error. If the vector is interpreted as a matrix, it is seen by Numpy as a row vector. This gives the dimensions error: (4x5) x (1x5)
.
When numpy sees the vector as an array, numpy.dot()
automatically does the right multiplication because the vector is seen as a column vector and the np.dot()
can be calculated correctly: (4x5) x (5x1)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With