В дополнение к методу get_pot()
, который ничего не возвращает, похоже, вы нигде не определяете self.n
или self.coeffs
.Я держу пари, что coeffs
должен быть пустым вектором, а n
его длиной, и я предполагаю, что они могут варьироваться между Crack
объектами, как z1
и z2
.
Исходя из этих предположений, я немного подправил ваш класс:
class Crack(object): # convention is to use capitalized class names
def __init__(self, z1, z2, coeffs):
self.z1 = z1
self.z2 = z2
self.coeffs = np.array(coeffs)
self.n = len(coeffs)
def __repr__(self):
return "Crack(z1=%s, z2=%s, coeffs=%s)" % (self.z1,
self.z2,
self.coeffs)
def get_big_Z(self, little_z):
# this may not need to be its own function, unless you
# use it separately from get_potential()
return little_z - 0.5 * (self.z2 - self.z1)
def get_potential(self, z):
Z = self.get_big_Z(z)
return (np.sum(np.arange(self.n) * self.coeffs *
(1.0 / (np.sqrt(Z - 1.0) * np.sqrt(Z + 1.0))) *
((Z - np.sqrt(Z - 1.0) * np.sqrt(Z + 1.0)) **
np.arange(self.n))) *
(2.0 / (self.z2 - self.z1))
)
Теперь предположим, что у вас есть (или вы можете сгенерировать) список значений z1
, z2
и coeffs
длякаждый Crack
:
>>> # dummy information, this makes three Crack objects
...
>>> z1_values = [3.0, 1.1, 0.2]
>>> z2_values = [0.01, 0.02, 0.03]
>>> coeff_values = [[1.1,1.0],
... [2.2,2.0],
... [3.3,3.0]]
Списки coeff
преобразуются в ndarray
при создании объекта.
Вы можете сделать crack_list
со встроенной функцией map()
примерно так:
>>> crack_list = map(Crack, z1_values, z2_values, coeff_values)
>>> from pprint import pprint
>>> pprint(crack_list)
[Crack(z1=3.0, z2=0.01, coeffs=[ 1.1 1. ]),
Crack(z1=1.1, z2=0.02, coeffs=[ 2.2 2. ]),
Crack(z1=0.2, z2=0.03, coeffs=[ 3.3 3. ])]
Затем вы можете вычислить общий потенциал для некоторых z
значений, скажем z = 5.0
или z = 3.14
, например:
>>> def total_potential(z, cracks):
... return sum(c.get_potential(z) for c in cracks)
...
>>>
>>> print total_potential(5.0, crack_list)
-0.772861759407
>>> print total_potential(3.14, crack_list)
-1.99073949493
Вуаля.В качестве проверки я бы также сделал некоторые вычисления на бумаге и пером, чтобы быть уверенным, что большое уравнение делает то, что должно.