Mafeni Alpha
Mafeni Alpha

Reputation: 308

sum in python where list of list are in exponential

I would like to write the following summation in python enter image description here

The coefficients are given as the following list

cn=[1.2,0.4,0.6]
vn=[1e-6,5e-5,1e-6]
gn=[4.5e3,6.5e3,9e3]
t=np.linspace(0,10,100)

I tried the following

import numpy as np
cn=[1.2,0.4,0.6]
vn=[1e-6,5e-5,1e-6]
gn=[4.5e3,6.5e3,9e3]
t=np.linspace(0,10,100)
yt=np.sum(cn *np.exp(-vn*(t-gn)**2))

but am getting the error

TypeError: bad operand type for unary -: 'list'

I would like to know where am getting it wrong or how to do this task

Upvotes: 2

Views: 756

Answers (3)

Massifox
Massifox

Reputation: 4487

This run:

import numpy as np
cn=np.array([1.2,0.4,0.6])
vn=np.array([1e-6,5e-5,1e-6])
gn=np.array([4.5e3,6.5e3,9e3])
t=np.linspace(0,10,3)
yt=np.sum(cn * np.exp(-vn * (t - gn)**2))
  1. Transform lists into numpy arrays

  2. Make sure the matrix / array sizes are compatible, (ie. You can't add arrays of different lengths)

Example: Add int to python list:

cn=[1.2,0.4,0.6]
cn+1
# output: TypeError: can only concatenate list (not "int") to list

Add int to numpy array:

cn=np.array([1.2,0.4,0.6])
cn+1
# output: array([2.2, 1.4, 1.6])

Add numpy arrays with different dimensions:

cn = np.arange(1,3)
t = np.arange(1,100)
cn + t
# output: ValueError: operands could not be broadcast together with shapes (2,) (99,) 

Add numpy arrays with the same dimensions:

cn = np.arange(1,3)
t = np.arange(3,5)
cn + t
# output: array([4, 6])

Upvotes: 3

Dev Khadka
Dev Khadka

Reputation: 5451

If found two issues which I fixed but I am not sure is what you intended.

you don't need to convert the list to numpy array because you can perform arithmetic array between ndarray and list which will result ndarray.

Two error found are 1. shape of t was not matching with other arrays 2. you were trying to negate python list which doesn't support it

Also as you haven't put tn in your mathematical expression of summation above so I doubt it you want the length of t to be 3

import numpy as np
cn=[1.2,0.4,0.6]
vn=[1e-6,5e-5,1e-6]
gn=[4.5e3,6.5e3,9e3]
t=np.linspace(0,10,3) # shape of t what 100 and not matching with other arrays
yt=np.sum(cn *np.exp(-(vn*(t-gn)**2))) # -(vn*(t-gn)**2)) wasn't wrapped in brackets

Upvotes: 1

Paul Panzer
Paul Panzer

Reputation: 53029

Here is a lazy way of fixing it:

 yt=np.sum(cn *np.exp(0-vn*(np.c_[t]-gn)**2), 1)
                      ^     ^------^        ^-^

I've highlighted the changes. The most important change is the np.c_ which does two things:

  1. It converts t to array
  2. It makes t a column vector

1) serves as a "germ" for converting all the other lists to arrays via overloaded arithmetic operators.

Exception: the unary - in front of vn hits vn before it gets the chance to become an array. We put a zero in front the - to make it binary, thereby reducing it's precedence and closing the array coercion chain. This is not the most obvious fix but the one involving the least typing.

2) separates the time dimension from the summation dimension which is likely the correct interpretation. We have to add an eplicit axis argument to the sum which is the 1 we inserted at the very end of the expression.

Upvotes: 1

Related Questions