APMonitor Summation with Vectors
Variable or object arrays are defined by square brackets with a range of integers and separated by a colon as variable[index 1:index 2]. Arrays may be used to define multiple equations or connections on one line. Any line with an array is processed sequentially from the lowest to the highest index. The model parser creates and processes the arrays as if they were written sequential in non-array form as shown in the example.
Higher dimensional arrays
Arrays with more than one dimension are allowed. The array indices are separated by brackets as var[i][j][k]. For operations on matrices, the precedence of operations is determined by the number of colons separating the vector indices. Matrix elements with fewer colon separators are executed first. For example, a set of 24 intermediate variables posed as:
- x[1:2][1::3][1:::4] = 1
results in the following set of equations:
- x[1][1][1] = 1
- x[2][1][1] = 1
- x[1][2][1] = 1
- x[2][2][1] = 1
- x[1][3][1] = 1
- x[2][3][1] = 1
- x[1][1][2] = 1
- etc...
Array Index Consistency
When processing the arrays, the parser checks for array size consistency. An error with an appropriate message is returned if the vector indeces are of different dimension.
Examples
! Method #1: Summation with arrays
Model array
Constants
n = 5
End Constants
Parameters
p[1:n] = 1
End Parameters
Variables
sum
End Variables
Intermediates
z[1] = p[1]
z[2:n] = z[1:n-1] + p[2:n]
End Intermediates
Equations
sum = z[n]
End Equations
End Model
|
! Method #2: Summation with the sum object
Objects
z = sum(5)
End Objects
Connections
p[1:n] = z.x[1:n]
y = z.y
End Connections
Model
Constants
n = 5
End Constants
Parameters
p[1:n] = 1
End Parameters
Variables
y
sum
End Variables
Equations
sum = y
End Equations
End Model
|
! Method #3: Summation without arrays
Model array
Parameters
p[1] = 1
p[2] = 1
p[3] = 1
p[4] = 1
p[5] = 1
End Parameters
Variables
sum
End Variables
Intermediates
z[1] = p[1]
z[2] = z[1] + p[2]
z[3] = z[2] + p[3]
z[4] = z[3] + p[4]
z[5] = z[4] + p[5]
End Intermediates
Equations
sum = z[5]
End Equations
End Model
|
An additional example is a matrix summation where there are two indices of the parameter matrix p.
! Matrix Summation
Model
Parameters
p[1:10][1::5] = 1
End Parameters
Variables
x
End Variables
Intermediates
! sum the rows
n[0][1:5] = 0
n[1:10][1::5] = n[0:9][1::5] + p[1:10][1::5]
! sum the columns that are summation of rows
m[0] = 0
m[1:5] = m[0:4] + n[10][1:5]
End Intermediates
Equations
! solution = 50
x = m[5]
End Equations
End Model
|
Arrays in Python GEKKO
Multi-dimensional arrays are defined in Python GEKKO with the m.Array() function or with list comprehensions.
m = GEKKO()
ni = 3 # number of rows
nj = 2 # number of columns
# best method: use m.Array function
x = m.Array(m.Var,(ni,nj))
m.Equations([x[i][j]==i*j+1 for i in range(ni) for j in range(nj)])
# another way: list comprehensions
y = [[m.Var() for j in range(nj)] for i in range(ni)]
for i in range(ni):
for j in range(nj):
m.Equation(x[i][j]**2==y[i][j])
# summation
z = m.Var()
m.Equation(z==sum([sum([x[i][j] for i in range(ni)]) for j in range(nj)]))
m.solve()
print('x:')
print(x)
print('y=x**2:')
print(y)
print('z')
print(z.value)