#python #numpy #class #dynamic
#python #numpy #класс #динамический
Вопрос:
Я хочу использовать lambda
в качестве входных данных для функции класса с именем Integrator
. Внутри Integrator
класса объект должен вызываться на основе текущего состояния. Я не знаю, как ввести эти объекты в Integrator
класс. Не могли бы вы сказать мне, как я могу вызвать созданный объект внутри другого класса? Вот основная программа моделирования:
# create LJ force object
lj_object = LennardJones(self.sigma, self.epsilon, self.compmethod, self.r_cut, self.box_len)
# create spring force object
sp_object = InterMolecularForce (self.oh_len, self.k_b, self.tet_eq, self.k_tet)
# create Integrator object
integrator_object = Integrator (O_mass, H_mass)
for i in range (grid.shape[0]-1) :
timespan = (grid [i], grid [i 1])
lj_force =lj_object (new_postate)
sp_force = sp_object(new_postate)
new_postate[i 1], new_velocity[i 1] = integrator_object (new_postate, new_velocity, lambda new_postate: lj_object (new_postate) sp_object(new_postate), timespan)
return new_postate, new_velocity
Интегратор :
# calculate half step momenta
momenta_half_step = diag_mass * velocity (force * (timespan[1] - timespan[0]) / 2)
position_full_step = posate (timespan[1] - timespan[0]) * np.dot (inv(mass_matrix), momenta_half_step)
# calculate forces
lj_force = lj_object (position_full_step)
spring_force = sp_object(position_full_step)
force = lj_force spring_force
momenta_full_step = momenta_half_step ( timespan[1] - timespan[0] ) * force / 2
Комментарии:
1. Я считаю, что этот вопрос трудно понять, потому что код рассказывает нам о том, что делает ваш код: вопрос не объясняет четко, что вы хотите, чтобы он делал. Вопрос в том, как мне передать лямбда-функцию в метод класса?
2. ДА. Как мне передать лямбда-функцию в метод класса?
3. Разве вы уже не передаете при вызове
integrator_object
?
Ответ №1:
У меня сильное ощущение, что я здесь упустил главное. Но без попыток какой-либо сложной прикладной математики, которую выполняет ваш код, вот простой, простой подход к передаче функции, определенной в операторе lambda, и передаче ее в класс для использования.
class Operation:
def __init__(self, operator):
self.operator = operator
def compute(self, *operands):
return self.operator(operands[0], operands[1])
>>> addition=Operation(operator=lambda a,b: a b)
>>> multiplication=Operation(operator=lambda a,b: a*b)
>>> addition.compute(3,5)
8
>>> multiplication.compute(3,5)
15
Это намеренно упрощено и надуманно: он не проверяет типы, он не обрабатывает и не отклоняет операторы, которые не являются двоичными, и в целом это не очень полезно. Его единственная цель — показать, как вызвать функцию, которая была передана в класс, что, по-видимому, является основным моментом вашего вопроса.