Fastest way to solve non-negative linear diophantine equations - python
Let A be a list of n lists of m non-negative integers, such that for all j there is i with A[i][j] nonzero. Let V be a list of m positive integers.
Question: What is the fastest way to find all the lists X of n non-negative integers such that for all i then sum_j A[i][j] X[j] = V[i]?
The assumptions implies that the number of solutions is finite. See below an example of A and V, with 5499 solutions X.
Let me reformulate the problem using matrix and vector. Let A be a n-by-m matrix with non-negative integral entries and without zero column. Let V be a vector with positive integral entries. What is the fastest way to find all the vectors X, with non-negative integral entries, such that AX=V?
The usual functions for solving such a system may underuse the non-negativity. To prove so, I wrote a brute-force code finding all the solutions of such a system and applied it to an example (see below, and these crossposts on mathoverflow and on ask.sagemath), but I'm still looking for something significantly faster than this; in fact I'm looking for the fastest way.
Example
Here is the kind of system I need to solve (where x_i is non-negative integral), but with possibly more equations and variables.
[
5*x0 + 5*x1 + 5*x2 + 6*x3 + 7*x4 + 7*x5 == 24,
5*x1 + 7*x10 + 5*x6 + 5*x7 + 6*x8 + 7*x9 == 25,
5*x11 + 6*x12 + 7*x13 + 7*x14 + 5*x2 + 5*x7 == 25,
5*x12 + 6*x15 + 7*x16 + 7*x17 + 5*x3 + 5*x8 == 30,
5*x13 + 6*x16 + 7*x18 + 7*x19 + 5*x4 + 5*x9 == 35,
5*x10 + 5*x14 + 6*x17 + 7*x19 + 7*x20 + 5*x5 == 35,
5*x1 + 7*x10 + 5*x6 + 5*x7 + 6*x8 + 7*x9 == 25,
5*x21 + 5*x22 + 6*x23 + 7*x24 + 7*x25 + 5*x6 == 24,
5*x22 + 5*x26 + 6*x27 + 7*x28 + 7*x29 + 5*x7 == 25,
5*x23 + 5*x27 + 6*x30 + 7*x31 + 7*x32 + 5*x8 == 30,
5*x24 + 5*x28 + 6*x31 + 7*x33 + 7*x34 + 5*x9 == 35,
5*x10 + 5*x25 + 5*x29 + 6*x32 + 7*x34 + 7*x35 == 35,
5*x11 + 6*x12 + 7*x13 + 7*x14 + 5*x2 + 5*x7 == 25,
5*x22 + 5*x26 + 6*x27 + 7*x28 + 7*x29 + 5*x7 == 25,
5*x11 + 5*x26 + 5*x36 + 6*x37 + 7*x38 + 7*x39 == 24,
5*x12 + 5*x27 + 5*x37 + 6*x40 + 7*x41 + 7*x42 == 30,
5*x13 + 5*x28 + 5*x38 + 6*x41 + 7*x43 + 7*x44 == 35,
5*x14 + 5*x29 + 5*x39 + 6*x42 + 7*x44 + 7*x45 == 35,
5*x12 + 6*x15 + 7*x16 + 7*x17 + 5*x3 + 5*x8 == 30,
5*x23 + 5*x27 + 6*x30 + 7*x31 + 7*x32 + 5*x8 == 30,
5*x12 + 5*x27 + 5*x37 + 6*x40 + 7*x41 + 7*x42 == 30,
5*x15 + 5*x30 + 5*x40 + 6*x46 + 7*x47 + 7*x48 == 35,
5*x16 + 5*x31 + 5*x41 + 6*x47 + 7*x49 + 7*x50 == 42,
5*x17 + 5*x32 + 5*x42 + 6*x48 + 7*x50 + 7*x51 == 42,
5*x13 + 6*x16 + 7*x18 + 7*x19 + 5*x4 + 5*x9 == 35,
5*x24 + 5*x28 + 6*x31 + 7*x33 + 7*x34 + 5*x9 == 35,
5*x13 + 5*x28 + 5*x38 + 6*x41 + 7*x43 + 7*x44 == 35,
5*x16 + 5*x31 + 5*x41 + 6*x47 + 7*x49 + 7*x50 == 42,
5*x18 + 5*x33 + 5*x43 + 6*x49 + 7*x52 + 7*x53 == 48,
5*x19 + 5*x34 + 5*x44 + 6*x50 + 7*x53 + 7*x54 == 49,
5*x10 + 5*x14 + 6*x17 + 7*x19 + 7*x20 + 5*x5 == 35,
5*x10 + 5*x25 + 5*x29 + 6*x32 + 7*x34 + 7*x35 == 35,
5*x14 + 5*x29 + 5*x39 + 6*x42 + 7*x44 + 7*x45 == 35,
5*x17 + 5*x32 + 5*x42 + 6*x48 + 7*x50 + 7*x51 == 42,
5*x19 + 5*x34 + 5*x44 + 6*x50 + 7*x53 + 7*x54 == 49,
5*x20 + 5*x35 + 5*x45 + 6*x51 + 7*x54 + 7*x55 == 48
]
Here are explicit A and V from above system (in list form):
A=[
[5,5,5,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,5,0,0,0,0,5,5,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,5,0,0,0,0,5,0,0,0,5,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,5,0,0,0,0,5,0,0,0,5,0,0,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,5,0,0,0,0,5,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,5,0,0,0,0,5,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,5,0,0,0,0,5,5,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,5,0,0,0,0,5,0,0,0,5,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0],
[0,0,0,5,0,0,0,0,5,0,0,0,5,0,0,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,6,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,7,7,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,7,7,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,7,7,0,0,0,0],
[0,0,0,0,5,0,0,0,0,5,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,7,7,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,7,7,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,7,7,0],
[0,0,0,0,0,5,0,0,0,0,5,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,6,0,7,7,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,7,7,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,7,7,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,7,7]
]
V=[24,25,25,30,35,35,25,24,25,30,35,35,25,25,24,30,35,35,30,30,30,35,42,42,35,35,35,42,48,49,35,35,35,42,49,48]
Computation
I wrote a brute-force code finding all the solutions of such a system, then applied it to A, V above. It took 12 seconds to find all 5499 solutions. I'm looking for something significantly faster than this.
sage: %time LX=NonnegativeSolverPartition(A,V)
CPU times: user 11.8 s, sys: 0 ns, total: 11.8 s
Wall time: 11.8 s
sage: len(LX)
5499
Note that the time reduces to 3 seconds with PyPy3, but it is still too slow for other (bigger) such systems I need to solve.
Code
Here is my (python) code, improved by Peter Taylor (see his comment):
def NonnegativeSolverPartition(A,V):
WB = WeakBasis(A)
VB = VarBound(A,V)
PP = []
for i, ll in WB:
L = tuple(A[i][j] for j in ll)
B = tuple(VB[j] for j in ll)
PP.append(WeightedPartitionSolver(L, B, V[i]))
return list(NonnegativeSolverPartitionInter(A, V, PP, WB, [-1] * len(A[0])))
def NonnegativeSolverPartitionInter(A, V, PP, WB, X):
if any(len(P) > 1 for P in PP):
_, ii = min((len(P), i) for i, P in enumerate(PP) if len(P) > 1)
for p in PP[ii]:
PPP = PP[:ii] + [[p]] + PP[ii+1:]
Fi = Filter(PPP, list(X), WB)
if Fi:
PPPP, XX = Fi
yield from NonnegativeSolverPartitionInter(A, V, PPPP, WB, XX)
else:
assert -1 not in X
yield X
def WeakBasis(A):
return tuple(enumerate([j for j, tmp in enumerate(row) if tmp] for row in A))
def WeightedPartitions(ws, n):
def inner(ws, n):
if n == 0:
yield (0,) * len(ws)
elif ws:
w = ws[0]
lim = n // w
ws = ws[1:]
for i in range(lim + 1):
for tl in inner(ws, n - w * i):
yield (i,) + tl
return list(inner(ws, n))
def VarBound(A,V):
nvars = len(A[0])
# Solve the individual constraints and then intersect the solutions.
possible_values = [None] * nvars
row_solns = []
for row, v in zip(A, V):
lut = []
ws = []
var_assignments = []
for j, val in enumerate(row):
if val:
lut.append(j)
ws.append(val)
var_assignments.append(set())
for soln in WeightedPartitions(ws, v):
for i, w in enumerate(soln):
var_assignments[i].add(w)
for j, assignments in zip(lut, var_assignments):
if possible_values[j] is None:
possible_values[j] = assignments
else:
possible_values[j] &= assignments
return tuple(frozenset(x) for x in possible_values)
def WeightedPartitionSolver(L, B, n):
# the entries of L must be non-negative
# B gives valid values coming from other equations (see VarBound)
def inner(L, B, n):
if n == 0:
yield (0,) * len(L)
elif L:
w, allowed = L[0], B[0]
L, B = L[1:], B[1:]
for i in range(n // w + 1):
if i in allowed:
for tl in inner(L, B, n - w * i):
yield (i,) + tl
return list(inner(L, B, n))
def Filter(PP, X, W):
if [] in PP:
return None
while True:
for Wi, P in zip(W, PP):
F = FixedPoints(P)
for j in F:
P0j = P[0][j]
Wij = Wi[1][j]
if X[Wij] == -1:
X[Wij] = P0j
elif X[Wij] != P0j:
return None
LL=[]
for Wi, P in zip(W, PP):
LL.append([p for p in P if not any(X[idx] not in (-1, pval) for idx, pval in zip(Wi[1], p))])
if not LL[-1]:
return None
if PP == LL:
return LL, X
PP = LL
def FixedPoints(P):
# This would prefer P to be transposed
m=len(P)
n=len(P[0])
return tuple(i for i in range(n) if all(P[j][i] == P[0][i] for j in range(m)))
A simpler brute-force code by Max Alekseyev is available in this answer.
Related
IndexError: invalid index to scalar variable.- PSO algorithm
While trying to solve this problem using PSO algorithm I got the error message as "IndexError: invalid index to scalar variable". Since I am new to PSO algorithm, I am unable to figure out the error. Kindly help me to solve the issue. import random import numpy as np import math import matplotlib.pyplot as plt def fitness_function(position): s1=0.014109786*position[0] + 0.004596846*position[1] + 0.01603721*position[2] + 0.029275618*position[3] + 0.007085358*position[4] + 0.013234328*position[5] + 0.012554958*position[6] + 0.012447232*position[7] + 0.007867602*position[8] + 0.011312568*position[9] + 0.003087858*position[10] + 0.016566954*position[11] + 0.008428942*position[12] + 0.008477444*position[13] + 0.004357354*position[14] s2=0.016566954*position[0] + 0.00585045*position[1] + 0.053172638*position[2] + 0.113404042*position[3] + 0.028190744*position[4] + 0.046330688*position[5] + 0.05629084*position[6] + 0.047796486*position[7] + 0.025793022*position[8] + 0.046164518*position[9] + 0.026696192*position[10] + 0.080422654*position[11] + 0.029074508*position[12] + 0.039611624*position[13] + 0.044835566*position[14] return s1+s2 #Some variables to calculate the velocity W = 0.5 c1 = 0.8 c2 = 0.9 target = 1 n_iterations = int(input("Inform the number of iterations: ")) target_error = float(input("Inform the target error: ")) n_particles = int(input("Inform the number of particles: ")) particle_position_vector=np.array([np.random.uniform(low=0.025, high=0.035) for i in range (n_particles)]) print(particle_position_vector) pbest_position = particle_position_vector pbest_fitness_value = float('inf') gbest_fitness_value = float('inf') gbest_position = np.array([float('inf')for _ in range(n_particles)]) velocity_vector =np.array([0,0,0,0,0,0,0,0,0,0,0,0,0,0]) print(velocity_vector) iteration = 0 while iteration < n_iterations: for i in range(n_particles): fitness_cadidate = fitness_function(particle_position_vector[i]) print(fitness_cadidate, ' ', particle_position_vector[i]) if(pbest_fitness_value[i] > fitness_cadidate): pbest_fitness_value[i] = fitness_cadidate pbest_position[i] = particle_position_vector[i] if(gbest_fitness_value > fitness_cadidate): gbest_fitness_value = fitness_cadidate gbest_position = particle_position_vector[i] if(abs(gbest_fitness_value - target) < target_error): break for i in range(n_particles): new_velocity = (W*velocity_vector[i]) + (c1*random.random()) * (pbest_position[i] - particle_position_vector[i]) + (c2*random.random()) * (gbest_position-particle_position_vector[i]) new_position = new_velocity + particle_position_vector[i] particle_position_vector[i] = new_position iteration = iteration + 1 print("The best position is ", gbest_position, "in iteration number ", iteration)``` ```IndexError Traceback (most recent call last) <ipython-input-35-5610603d3302> in <module> 32 while iteration < n_iterations: 33 for i in range(n_particles): ---> 34 fitness_cadidate = fitness_function(particle_position_vector[i]) 35 print(fitness_cadidate, ' ', particle_position_vector[i]) 36 <ipython-input-35-5610603d3302> in fitness_function(position) 5 6 def fitness_function(position): ----> 7 s1=0.014109786*position[0] + 0.004596846*position[1] + 0.01603721*position[2] + 0.029275618*position[3] + 0.007085358*position[4] + 0.013234328*position[5] + 0.012554958*position[6] + 0.012447232*position[7] + 0.007867602*position[8] + 0.011312568*position[9] + 0.003087858*position[10] + 0.016566954*position[11] + 0.008428942*position[12] + 0.008477444*position[13] + 0.004357354*position[14] 8 s2=0.016566954*position[0] + 0.00585045*position[1] + 0.053172638*position[2] + 0.113404042*position[3] + 0.028190744*position[4] + 0.046330688*position[5] + 0.05629084*position[6] + 0.047796486*position[7] + 0.025793022*position[8] + 0.046164518*position[9] + 0.026696192*position[10] + 0.080422654*position[11] + 0.029074508*position[12] + 0.039611624*position[13] + 0.044835566*position[14] 9 return s1+s2 IndexError: invalid index to scalar variable. Moreover, I want to plot a graph of fitness value with the iteration numbers. Please help me.
Infeasible solution by pulp [duplicate]
I'm trying to solve an assignment problem with pulp. The basic part of the code is as follows: set_I = range(1, numberOfPoints) set_J = range(1, numberOfCentroids) tau = 0.15 Q = 15 # decision variable x_vars = LpVariable.dicts(name="x_vars", indexs=(set_I, set_J), lowBound=0, upBound=1, cat=LpInteger) # model name prob = LpProblem("MIP_Model", LpMinimize) # constraints for i in set_I: prob += lpSum(x_vars[i][j] for j in set_J) == 1, "" for j in set_J: prob += lpSum(x_vars[i][j] for i in set_I) >= 1, "" for j in set_J: prob += lpSum(x_vars[i][j] for i in set_I) <= Q*(1-tau), "" for j in set_J: prob += lpSum(x_vars[i][j] for i in set_I) >= Q*(1+tau), "" # objective prob += lpSum(d[i, j]*x_vars[i][j] for i in set_I for j in set_J) prob.solve() The result is like this: Problem MODEL has 31 rows, 76 columns and 304 elements Coin0008I MODEL read with 0 errors Problem is infeasible - 0.01 seconds Option for printingOptions changed from normal to all However, the problem is not infeasible and results are obtained with other solvers. I wonder if there is a syntax error and is the problem caused by this? I have asked a similar question in the next link: Infeasible solution by pulp
When I run the problem locally, with d a matrix of ones, 20 points, and 3 centroids. It also becomes infeasible for me. Look at the constraints: _C22: x_vars_10_1 + x_vars_11_1 + x_vars_12_1 + x_vars_13_1 + x_vars_14_1 + x_vars_15_1 + x_vars_16_1 + x_vars_17_1 + x_vars_18_1 + x_vars_19_1 + x_vars_1_1 + x_vars_2_1 + x_vars_3_1 + x_vars_4_1 + x_vars_5_1 + x_vars_6_1 + x_vars_7_1 + x_vars_8_1 + x_vars_9_1 <= 12.75 _C23: x_vars_10_2 + x_vars_11_2 + x_vars_12_2 + x_vars_13_2 + x_vars_14_2 + x_vars_15_2 + x_vars_16_2 + x_vars_17_2 + x_vars_18_2 + x_vars_19_2 + x_vars_1_2 + x_vars_2_2 + x_vars_3_2 + x_vars_4_2 + x_vars_5_2 + x_vars_6_2 + x_vars_7_2 + x_vars_8_2 + x_vars_9_2 <= 12.75 _C24: x_vars_10_1 + x_vars_11_1 + x_vars_12_1 + x_vars_13_1 + x_vars_14_1 + x_vars_15_1 + x_vars_16_1 + x_vars_17_1 + x_vars_18_1 + x_vars_19_1 + x_vars_1_1 + x_vars_2_1 + x_vars_3_1 + x_vars_4_1 + x_vars_5_1 + x_vars_6_1 + x_vars_7_1 + x_vars_8_1 + x_vars_9_1 >= 17.25 _C25: x_vars_10_2 + x_vars_11_2 + x_vars_12_2 + x_vars_13_2 + x_vars_14_2 + x_vars_15_2 + x_vars_16_2 + x_vars_17_2 + x_vars_18_2 + x_vars_19_2 + x_vars_1_2 + x_vars_2_2 + x_vars_3_2 + x_vars_4_2 + x_vars_5_2 + x_vars_6_2 + x_vars_7_2 + x_vars_8_2 + x_vars_9_2 >= 17.25 You require x_vars_10_2 + x_vars_11_2 + x_vars_12_2 + x_vars_13_2 + x_vars_14_2 + x_vars_15_2 + x_vars_16_2 + x_vars_17_2 + x_vars_18_2 + x_vars_19_2 + x_vars_1_2 + x_vars_2_2 + x_vars_3_2 + x_vars_4_2 + x_vars_5_2 + x_vars_6_2 + x_vars_7_2 + x_vars_8_2 + x_vars_9_2 to be greater than 17.25 and smaller than 12.75 at the same time. That's not possible, of course.
numpy.ndarray lambda is not callable within loop when using scipy.minimize_scalar, works fine single-run
I'm working on a piece of code that calculates surface wave velocities. When I run this as a single-shot in my Jupyter notebook it works fine, however when I try to start looping over the phi1 angle, I end up with the 'numpy.ndarray is not callable error' after the zero iteration of the loop. It seems to be focused on the lambda (g) I am using, but I am not sure the best way to go about debugging it. Any help/review would be greatly appreciated as Google searches aren't helping too much. I do apologize for the novel of code, but this is trimmed down to where it should be easily reproducible. ## This code is an implementation of the framework described by M. Cherry et al. in ## Cherry, Matthew R., Shamachary Sathish, and Ramana Grandhi. "A numerical method for predicting Rayleigh surface wave ## velocity in anisotropic crystals." Journal of Computational Physics 351 (2017): 108-120. ## The logic of this code is as follows. ## (1) It then calculates R, T, and Qv (which is the velocity independent Q, needed to determine the velocity range ## over which to search. ## (2) It then iterates to determine the velocity range by changing a variable called 'angle'. ## (3) It then finds a minimum vL, and solves for Q (with velocity as a term), N, A, B, and Z matrices. ## (4) It stores the three Euler angles (p1, P, p2) and RSW_vel ## This does not deal with pseudowaves yet. import matplotlib.pyplot as plt import numpy as np import scipy as sp import scipy.optimize as spo import scipy.linalg as la from scipy.linalg import eig, eigvals import math from decimal import * import time ts1 = time.time() # Setup material properties # Setup the Cij matrix of Ni (units in Pa) C11 = C22 = C33 = 2.41e11 C12 = C13 = C23 = C21 = C31 = C32 = 1.47e11 C14 = C15 = C16 = C24 = C25 = C26 = C34 = C35 = C36 = C41 = C42 = C43 = C51 = C52 = C53 = C61 = C62 = C63 = 0 C44 = C55 = C66 = 1.26e11 C45 = C46 = C56 = C54 = C64 = C65 = 0 Cij_list = np.array([C11,C12,C13,C14,C15,C16,C21,C22,C23,C24,C25,C26,C31,C32,C33,C34,C35,C36,C41,C42,C43,C44,C45,C46,C51,C52,C53,C54,C55,C56,C61,C62,C63,C64,C65,C66]) Cij=Cij_list.reshape(6,6) print('Cij =') print(Cij) # Setup density of Ni (units are in kg/m3) rho = 8910 RSW_matrix = np.array([0,0,0,0]) ## This is where the setting up of the loop for p1, P, and p2 should be. # Setup Euler Angles in Bunge's active notation (one time only - demo, will need to be iterated over), angles in degrees. p1 = phi1, P = Phi, p2 = phi2 #p1 = 15 P = 45 p2 = 8 for rotation in range(0, 180): ## Below this point, everything must be done for every Euler calculation. p1_rad = np.radians(rotation) P_rad = np.radians(P) p2_rad = np.radians(p2) Eul_Ang_deg = np.array([p1,P,p2]) Eul_Ang_rad = np.array([p1_rad,P_rad,p2_rad]) c1 = np.cos(p1_rad) c2 = np.cos(P_rad) c3 = np.cos(p2_rad) s1 = np.sin(p1_rad) s2 = np.sin(P_rad) s3 = np.sin(p2_rad) # Solve Rotation Matrix from Bunge's active notation, and m and n (m is wave propagation vector, n is plane normal) Rot_mat = np.array([[c1*c3-c2*s1*s3,-c1*s3-c2*c3*s1,s1*s2], [c3*s1+c1*c2*s3,c1*c2*c3-s1*s3,-c1*s2], [s2*s3,c3*s2,c2]]) #- could fill in the rest here and just extract col 1 and col 3 print('Rotation Matrix =') print(Rot_mat) m_vec = Rot_mat[[0],:] m1 = Rot_mat[[0],[0]] m2 = Rot_mat[[0],[1]] m3 = Rot_mat[[0],[2]] n_vec = Rot_mat[[2],:] n1 = Rot_mat[[2],[0]] n2 = Rot_mat[[2],[1]] n3 = Rot_mat[[2],[2]] # Below, we calculate R, T and Q matrices # CORRECT R matrix calculations Rij = np.ndarray(shape=(3,3)) Rij[0,0] = C11*m1*n1 + C61*m2*n1 + C51*m3*n1 + C16*m1*n2 + C66*m2*n2 + C56*m3*n2 + C15*m1*n3 + C65*m2*n3 + C55*m3*n3 Rij[0,1] = C16*m1*n1 + C66*m2*n1 + C56*m3*n1 + C12*m1*n2 + C62*m2*n2 + C52*m3*n2 + C14*m1*n3 + C64*m2*n3 + C54*m3*n3 Rij[0,2] = C15*m1*n1 + C65*m2*n1 + C55*m3*n1 + C14*m1*n2 + C64*m2*n2 + C54*m3*n2 + C13*m1*n3 + C63*m2*n3 + C53*m3*n3 Rij[1,0] = C61*m1*n1 + C21*m2*n1 + C41*m3*n1 + C66*m1*n2 + C26*m2*n2 + C46*m3*n2 + C65*m1*n3 + C25*m2*n3 + C45*m3*n3 Rij[1,1] = C66*m1*n1 + C26*m2*n1 + C46*m3*n1 + C62*m1*n2 + C22*m2*n2 + C42*m3*n2 + C64*m1*n3 + C24*m2*n3 + C44*m3*n3 Rij[1,2] = C65*m1*n1 + C25*m2*n1 + C45*m3*n1 + C64*m1*n2 + C24*m2*n2 + C44*m3*n2 + C63*m1*n3 + C23*m2*n3 + C43*m3*n3 Rij[2,0] = C51*m1*n1 + C41*m2*n1 + C31*m3*n1 + C56*m1*n2 + C46*m2*n2 + C36*m3*n2 + C55*m1*n3 + C45*m2*n3 + C35*m3*n3 Rij[2,1] = C56*m1*n1 + C46*m2*n1 + C36*m3*n1 + C52*m1*n2 + C42*m2*n2 + C32*m3*n2 + C54*m1*n3 + C44*m2*n3 + C34*m3*n3 Rij[2,2] = C55*m1*n1 + C45*m2*n1 + C35*m3*n1 + C54*m1*n2 + C44*m2*n2 + C34*m3*n2 + C53*m1*n3 + C43*m2*n3 + C33*m3*n3 Rij_trans = np.transpose(Rij) Rij_inv = np.linalg.inv(Rij) # CORRECT T matrix calculations Tij = np.ndarray(shape=(3,3)) Tij[0,0] = C11*n1*n1 + C16*n2*n1 + C51*n3*n1 + C16*n1*n2 + C66*n2*n2 + C56*n3*n2 + C15*n1*n3 + C65*n2*n3 + C55*n3*n3 Tij[0,1] = C16*n1*n1 + C66*n2*n1 + C56*n3*n1 + C12*n1*n2 + C62*n2*n2 + C52*n3*n2 + C14*n1*n3 + C64*n2*n3 + C54*n3*n3 Tij[0,2] = C15*n1*n1 + C65*n2*n1 + C55*n3*n1 + C14*n1*n2 + C64*n2*n2 + C54*n3*n2 + C13*n1*n3 + C63*n2*n3 + C53*n3*n3 Tij[1,0] = C61*n1*n1 + C21*n2*n1 + C41*n3*n1 + C66*n1*n2 + C26*n2*n2 + C46*n3*n2 + C65*n1*n3 + C25*n2*n3 + C45*n3*n3 Tij[1,1] = C66*n1*n1 + C26*n2*n1 + C46*n3*n1 + C62*n1*n2 + C22*n2*n2 + C42*n3*n2 + C64*n1*n3 + C24*n2*n3 + C44*n3*n3 Tij[1,2] = C65*n1*n1 + C25*n2*n1 + C45*n3*n1 + C64*n1*n2 + C24*n2*n2 + C44*n3*n2 + C63*n1*n3 + C23*n2*n3 + C43*n3*n3 Tij[2,0] = C51*n1*n1 + C41*n2*n1 + C31*n3*n1 + C56*n1*n2 + C46*n2*n2 + C36*n3*n2 + C55*n1*n3 + C45*n2*n3 + C35*n3*n3 Tij[2,1] = C56*n1*n1 + C46*n2*n1 + C36*n3*n1 + C52*n1*n2 + C42*n2*n2 + C32*n3*n2 + C54*n1*n3 + C44*n2*n3 + C34*n3*n3 Tij[2,2] = C55*n1*n1 + C45*n2*n1 + C35*n3*n1 + C54*n1*n2 + C44*n2*n2 + C34*n3*n2 + C53*n1*n3 + C43*n2*n3 + C33*n3*n3 Tij_trans = np.transpose(Tij) Tij_inv = np.linalg.inv(Tij) ## R and T defined as above. Q needs to be new - and not remove the rv2. Thus, we introduce Qv for "Q to determine ## critical velocity" Qv = np.ndarray(shape=(3,3)) Qv[0,0] = C11*m1*m1 + C61*m2*m1 + C51*m3*m1 + C16*m1*m2 + C66*m2*m2 + C56*m3*m2 + C15*m1*m3 + C65*m2*m3 + C55*m3*m3 Qv[0,1] = C16*m1*m1 + C66*m2*m1 + C56*m3*m1 + C12*m1*m2 + C62*m2*m2 + C52*m3*m2 + C14*m1*m3 + C64*m2*m3 + C54*m3*m3 Qv[0,2] = C15*m1*m1 + C65*m2*m1 + C55*m3*m1 + C14*m1*m2 + C64*m2*m2 + C54*m3*m2 + C13*m1*m3 + C63*m2*m3 + C53*m3*m3 Qv[1,0] = C61*m1*m1 + C21*m2*m1 + C41*m3*m1 + C66*m1*m2 + C26*m2*m2 + C46*m3*m2 + C65*m1*m3 + C25*m2*m3 + C45*m3*m3 Qv[1,1] = C66*m1*m1 + C26*m2*m1 + C46*m3*m1 + C62*m1*m2 + C22*m2*m2 + C42*m3*m2 + C64*m1*m3 + C24*m2*m3 + C44*m3*m3 Qv[1,2] = C65*m1*m1 + C25*m2*m1 + C45*m3*m1 + C64*m1*m2 + C24*m2*m2 + C44*m3*m2 + C63*m1*m3 + C23*m2*m3 + C43*m3*m3 Qv[2,0] = C51*m1*m1 + C41*m2*m1 + C31*m3*m1 + C56*m1*m2 + C46*m2*m2 + C36*m3*m2 + C55*m1*m3 + C45*m2*m3 + C35*m3*m3 Qv[2,1] = C56*m1*m1 + C46*m2*m1 + C36*m3*m1 + C52*m1*m2 + C42*m2*m2 + C32*m3*m2 + C54*m1*m3 + C44*m2*m3 + C34*m3*m3 Qv[2,2] = C55*m1*m1 + C45*m2*m1 + C35*m3*m1 + C54*m1*m2 + C44*m2*m2 + C34*m3*m2 + C53*m1*m3 + C43*m2*m3 + C33*m3*m3 res = [] res = spo.minimize_scalar(lambda x: ((min(eigvals(Qv * np.cos(np.radians(x)) * np.cos(np.radians(x)) + (Rij + Rij_trans) * np.cos(np.radians(x)) * np.sin(np.radians(x)) + Tij * np.sin(np.radians(x)) * np.sin(np.radians(x)))) / rho)**(0.5))*(1/(np.abs(np.cos(np.radians(x))))), bracket=(-90,0,90), method='Golden') vel_L = res.fun.real vel_L_int = int(vel_L) print('velocity limit') print(vel_L) print(vel_L_int) Det_B_try = 1 Qij = np.zeros(shape=(3,3)) Qij[0,1] = C16*m1*m1 + C66*m2*m1 + C56*m3*m1 + C12*m1*m2 + C62*m2*m2 + C52*m3*m2 + C14*m1*m3 + C64*m2*m3 + C54*m3*m3 Qij[0,2] = C15*m1*m1 + C65*m2*m1 + C55*m3*m1 + C14*m1*m2 + C64*m2*m2 + C54*m3*m2 + C13*m1*m3 + C63*m2*m3 + C53*m3*m3 Qij[1,0] = C61*m1*m1 + C21*m2*m1 + C41*m3*m1 + C66*m1*m2 + C26*m2*m2 + C46*m3*m2 + C65*m1*m3 + C25*m2*m3 + C45*m3*m3 Qij[1,2] = C65*m1*m1 + C25*m2*m1 + C45*m3*m1 + C64*m1*m2 + C24*m2*m2 + C44*m3*m2 + C63*m1*m3 + C23*m2*m3 + C43*m3*m3 Qij[2,0] = C51*m1*m1 + C41*m2*m1 + C31*m3*m1 + C56*m1*m2 + C46*m2*m2 + C36*m3*m2 + C55*m1*m3 + C45*m2*m3 + C35*m3*m3 Qij[2,1] = C56*m1*m1 + C46*m2*m1 + C36*m3*m1 + C52*m1*m2 + C42*m2*m2 + C32*m3*m2 + C54*m1*m3 + C44*m2*m3 + C34*m3*m3 for v in range(1, vel_L_int): # Calculate rho vel-squared rv2 = rho * v ** 2 # CORRECT Q matrix calculations Qij[0,0] = C11*m1*m1 + C61*m2*m1 + C51*m3*m1 + C16*m1*m2 + C66*m2*m2 + C56*m3*m2 + C15*m1*m3 + C65*m2*m3 + C55*m3*m3 - rv2 Qij[1,1] = C66*m1*m1 + C26*m2*m1 + C46*m3*m1 + C62*m1*m2 + C22*m2*m2 + C42*m3*m2 + C64*m1*m3 + C24*m2*m3 + C44*m3*m3 - rv2 Qij[2,2] = C55*m1*m1 + C45*m2*m1 + C35*m3*m1 + C54*m1*m2 + C44*m2*m2 + C34*m3*m2 + C53*m1*m3 + C43*m2*m3 + C33*m3*m3 - rv2 Qij_trans = np.transpose(Qij) Qij_inv = np.linalg.inv(Qij) # Create a new Nik matrix TR_ik = -1*np.matmul(Tij_inv, Rij_trans) TI_ik = Tij_inv QRTR_ik = -Qij + np.matmul(np.matmul(Rij, Tij_inv), Rij_trans) RT_ik = -1*np.matmul(Rij, Tij_inv) # Nik Creation Nik_r1to3 = np.concatenate((TR_ik,TI_ik),axis=1) Nik_r4to6 = np.concatenate((QRTR_ik,RT_ik),axis=1) Nik_whole = np.concatenate((Nik_r1to3,Nik_r4to6)) # Eigenvalues and Eigenvectors of Nik eigvals, eigvecs = eig(Nik_whole) ## The following code sorts the eigenvalues for those with negative imaginary numbers, and conducts the matrix ## operations to generate the B, A, and Z matrices from the COLUMNS in Pythons representation of eigenvectors eigvecsT = np.transpose(eigvecs) output_ab = output_ab_neg_imag = eigvecsT[eigvals.imag < 0] output_abT = np.transpose(output_ab) ### This is the B matrix (bottom 3 vectors assumed as b) B_matrix = output_b = np.delete(output_abT, [0,1,2], axis=0) B_matrixT = np.transpose(B_matrix) ### This is the A matrix (these are the displacement vectors, and when A is combined with B, the surface impedance (Z) matrix can be found) A_matrix = output_a = np.delete(output_abT, [3,4,5], axis=0) det_B = np.linalg.det(B_matrix) det_cc_B = det_B.conjugate() det_B_x_det_cc_B = det_B*det_cc_B v_real = v.real det_B_x_det_cc_B_real = det_B_x_det_cc_B.real if det_B_x_det_cc_B_real < Det_B_try: RSW_vel = v_real Det_B_try = det_B_x_det_cc_B_real print('RSW =') print(RSW_vel) print('Min |B|x|B|* =') print(Det_B_try) col_to_be_added2 = np.array([p1, P, p2, RSW_vel]) RSW_matrix = np.column_stack((RSW_matrix,col_to_be_added2)) print('RSW vel matrix is') print(RSW_matrix)
IndexError: list assignment index out of range. How do I solve this?
I am trying the Newmark's constant average acceleration method. I am getting this error. How do I recover from this error? IndexError Traceback (most recent call last) 41 for i in range(len(t)): 42 pn[i+1] = p[i+1]+ a1*u[i] + a2*v[i] + a3*a[i] 43 u[i+1] = pn[i+1]/kn 44 v[i+1] = y*(u[i+1]-u[i])/(b*dt) + (1-y/b)v[i] + dt (1-y/(2*b))*a[i] IndexError: list assignment index out of range y = 1/2 b = 1/4 u = [] v = [] t = [] p = [0,25,43.3013,50,43.3013,25,0,0,0,0,0,0] a = [] pn = [] pn.append(0) x = 0.0 for i in range(11): z = 0.0 + x t.append(z) x = x + 0.1 m = 0.45594 k = 18 c = 0.2865 u.append(0) v.append(0) a.append((p[0]-c*v[0]-k*u[0])/m) dt = 0.1 a1 =(m/(b*dt*dt)+y*c/(b*dt)) a2 = (m/(b*dt)+(y/b-1)*c) a3 = (((1/(2*b))-1)*m + dt*((y/(2*b))-1)*c) kn = k + a1 for i in range(len(t)-1): pn[i+1] = p[i+1]+ a1*u[i] + a2*v[i] + a3*a[i] u[i+1] = pn[i+1]/kn v[i+1] = y*(u[i+1]-u[i])/(b*dt) + (1-y/b)*v[i] + dt* (1-y/(2*b))*a[i] a[i+1] = (u[i+1]-u[i])/(b*dt*dt) - v[i]/(b*dt)-(1/(2*b)-1)*a[i]
Your pn, a, u, v are defined as a list with length 1, so there is no index such as pn[1]. You can use append or define the list with needed length. for i in range(len(t)): pn.append(p[i+1] + a1*u[i] + a2*v[i] + a3*a[i]) u.append(pn[i+1]/kn) v.append(y*(u[i+1]-u[i])/(b*dt) + (1-y/b)*v[i] + dt* (1-y/(2*b))*a[i]) a.append((u[i+1]-u[i])/(b*dt*dt) - v[i]/(b*dt)-(1/(2*b)-1)*a[i]) or pn, a, u, v = [0]*11, [0]*11, [0]*11 [0]*11 pn[0], u[0], v[0] = 0, 0, 0 a[0] = (p[0]-c*v[0]-k*u[0])/m ... for i in range(len(t)-1): pn[i+1] = p[i+1] + a1*u[i] + a2*v[i] + a3*a[i] u[i+1] = pn[i+1]/kn v[i+1] = y*(u[i+1]-u[i])/(b*dt) + (1-y/b)*v[i] + dt* (1-y/(2*b))*a[i] a[i+1] = (u[i+1]-u[i])/(b*dt*dt) - v[i]/(b*dt)-(1/(2*b)-1)*a[i]
Taylor polynomial calculation
I am currently doing a python exercise for my University studies. I am very stuck at this task: The taylor polynomial of degree N for the exponential function e^x is given by: N p(x) = Sigma x^k/k! k = 0 Make a program that (i) imports class Polynomial (found under), (ii) reads x and a series of N values from the command line, (iii) creates a Polynomial instance representing the Taylor polynomial, and (iv) prints the values of p(x) for the given N values as well as the exact value e^x. Try the program out with x = 0.5, 3, 10 and N = 2, 5, 10, 15, 25. Polynomial.py import numpy class Polynomial: def __init__(self, coefficients): self.coeff = coefficients def __call__(self, x): """Evaluate the polynomial.""" s = 0 for i in range(len(self.coeff)): s += self.coeff[i]*x**i return s def __add__(self, other): # Start with the longest list and add in the other if len(self.coeff) > len(other.coeff): result_coeff = self.coeff[:] # copy! for i in range(len(other.coeff)): result_coeff[i] += other.coeff[i] else: result_coeff = other.coeff[:] # copy! for i in range(len(self.coeff)): result_coeff[i] += self.coeff[i] return Polynomial(result_coeff) def __mul__(self, other): c = self.coeff d = other.coeff M = len(c) - 1 N = len(d) - 1 result_coeff = numpy.zeros(M+N+1) for i in range(0, M+1): for j in range(0, N+1): result_coeff[i+j] += c[i]*d[j] return Polynomial(result_coeff) def differentiate(self): """Differentiate this polynomial in-place.""" for i in range(1, len(self.coeff)): self.coeff[i-1] = i*self.coeff[i] del self.coeff[-1] def derivative(self): """Copy this polynomial and return its derivative.""" dpdx = Polynomial(self.coeff[:]) # make a copy dpdx.differentiate() return dpdx def __str__(self): s = '' for i in range(0, len(self.coeff)): if self.coeff[i] != 0: s += ' + %g*x^%d' % (self.coeff[i], i) # Fix layout s = s.replace('+ -', '- ') s = s.replace('x^0', '1') s = s.replace(' 1*', ' ') s = s.replace('x^1 ', 'x ') #s = s.replace('x^1', 'x') # will replace x^100 by x^00 if s[0:3] == ' + ': # remove initial + s = s[3:] if s[0:3] == ' - ': # fix spaces for initial - s = '-' + s[3:] return s def simplestr(self): s = '' for i in range(0, len(self.coeff)): s += ' + %g*x^%d' % (self.coeff[i], i) return s def _test(): p1 = Polynomial([1, -1]) p2 = Polynomial([0, 1, 0, 0, -6, -1]) p3 = p1 + p2 print p1, ' + ', p2, ' = ', p3 p4 = p1*p2 print p1, ' * ', p2, ' = ', p4 print 'p2(3) =', p2(3) p5 = p2.derivative() print 'd/dx', p2, ' = ', p5 print 'd/dx', p2, p2.differentiate() print ' = ', p5 p4 = p2.derivative() print 'd/dx', p2, ' = ', p4 if __name__ == '__main__': _test() Now I'm really stuck at this, and I would love to get an explaination! I am supposed to write my code in a separate file. I'm thinking about making an instance of the Polynomial class, and sending in the list in argv[2:], but that doesn't seem to be working. Do I have to make a def to calculate the taylor polynomial for the different values of N before sending it in to the Polynomial class? Any help is great, thanks in advance :)
Not quite finished, but this answers your main question I believe. Put class Polynomial in poly.p and import it. from poly import Polynomial as p from math import exp,factorial def get_input(n): ''' get n numbers from stdin ''' entered = list() for i in range(n): print 'input number ' entered.append(raw_input()) return entered def some_input(): return [[2,3,4],[4,3,2]] get input from cmd line n = 3 a = get_input(n) b = get_input(n) #a,b = some_input() ap = p(a) bp = p(b) print 'entered : ',a,b c = ap+bp print 'a + b = ',c print exp(3) x = ap print x sum = p([0]) for k in range(1,5): el = x for j in range(1,k): el el * x print 'el: ',el if el!=None and sum!=None: sum = sum + el print 'sum ',sum output entered : [2, 3, 4] [4, 3, 2] a + b = 6*1 + 6*x + 6*x^2 20.0855369232 2*1 + 3*x + 4*x^2 sum 2*1 + 3*x + 4*x^2 el: 4*1 + 12*x + 25*x^2 + 24*x^3 + 16*x^4 sum 6*1 + 15*x + 29*x^2 + 24*x^3 + 16*x^4 el: 4*1 + 12*x + 25*x^2 + 24*x^3 + 16*x^4 el: 8*1 + 36*x + 102*x^2 + 171*x^3 + 204*x^4 + 144*x^5 + 64*x^6 sum 14*1 + 51*x + 131*x^2 + 195*x^3 + 220*x^4 + 144*x^5 + 64*x^6 el: 4*1 + 12*x + 25*x^2 + 24*x^3 + 16*x^4 el: 8*1 + 36*x + 102*x^2 + 171*x^3 + 204*x^4 + 144*x^5 + 64*x^6 el: 16*1 + 96*x + 344*x^2 + 792*x^3 + 1329*x^4 + 1584*x^5 + 1376*x^6 + 768*x^7 + 256*x^8 sum 30*1 + 147*x + 475*x^2 + 987*x^3 + 1549*x^4 + 1728*x^5 + 1440*x^6 + 768*x^7 + 256*x^8
I solved the task in the following way, though im not sure if it answers question (iv). The output just compares the exact value of e**x to the calculated value from module Polynomial. from math import factorial, exp from Polynomial import * from sys import * #Reads x and N from the command line on the form [filename.py, x-value, N-value] x = eval(argv[1]) N = eval(argv[2]) #Creating list of coefficients on the form [1 / i!] list_coeff = [1./factorial(i) for i in range(N)] print list_coeff #Creating an instance of class Polynomial p1 = Polynomial(list_coeff) print 'Calculated value of e**%f = %f ' %(x, p1.__call__(x)) print 'Exact value of e**%f = %f'% (x, exp(x)) """Test Execution Terminal > python Polynomial_exp.py 0.5 5 [1.0, 1.0, 0.5, 0.16666666666666666, 0.041666666666666664] Calculated value of e**0.500000 = 1.648438 Exact value of e**0.500000 = 1.648721 """