將 Python 腳本轉換為 C++

警報

我有一個運行正常的 Python 腳本。但是我需要將此腳本實現為 C++ 中的根宏。由於我不太熟悉 python 語法,所以我很難過。

ATOMIC_MASS = 931.4940954e6  


class ReducedMomentum:
    def __init__(self, mass):
        self.mass = mass

    def __call__(self, kinetic_energy):
        return math.sqrt(kinetic_energy * (kinetic_energy + 2 * self.mass)) / self.mass


class MassFraction:
    def __init__(self, tritium_mass, electron_mass):
        self.tritium_mass = tritium_mass
        self.electron_mass = electron_mass

    def __call__(self, spectator_mass):
        return spectator_mass / (spectator_mass + self.tritium_mass + 2 * self.electron_mass)


class Ktilde:
    def __init__(self, alpha_1, tritium_mass, electron_mass_eV):
        self.alpha_1 = alpha_1
        self.mass_fraction = MassFraction(tritium_mass, electron_mass_eV / ATOMIC_MASS)
        self.reduced_momentum = ReducedMomentum(electron_mass_eV)

    def __call__(self, spectator_mass, electron_kinetic_energy):
        return self.alpha_1 * self.mass_fraction(spectator_mass) * self.reduced_momentum(electron_kinetic_energy)

我已經理解了前幾行,但主要問題是以下部分:

        self.mass_fraction = MassFraction(tritium_mass, electron_mass_eV / ATOMIC_MASS)

螞蟻這下面的線。如何將這些行轉換為 C++?它們在數學上究竟是什麼意思?

熟悉的台詞又出現了幾次:

    ktilde = Ktilde(alpha_1, spectator_masses, electron_mass)
    mass_spectator = parse_spectator_mass(args, parser)
    ktilde_value = ktilde(mass_spectator, args.energy)
    print('{:.4f}'.format(ktilde_value))

這可能相當微不足道,但我在谷歌上找不到任何解決方案。非常感謝!

安德魯·霍姆格倫

當類這樣調用自身時,它調用的是類中的 __call__ 方法,例如 operator()。__init__ 就像一個構造函數,在類被實例化時被調用,所以在類到達 __call__ 時 init 中的所有內容都可用。

class ReducedMomentum:
    # here is where an instance of the object calls itself
    def __call__(self, kinetic_energy):
        """Example
           reduced_momentum = ReducedMomentum(5)
           reduction = reduced_momentum(5)
        """
        return math.sqrt(kinetic_energy * (kinetic_energy + 2 * self.mass)) / self.mass

所以對於你的 Ktilde 類,例如

class Ktilde:
    def __init__(self, alpha_1, tritium_mass, electron_mass_eV):
        """Constructor needing above arguments
           alpha_1: float?
           tritium_mass: float?
           electron_mass_eV: float?

           Example:
           k_tilde = Ktilde(1., 1., 1.)  # initialize with params
           some_spectator_mass = 2.  # some other relevant numbers
           some_electron_KE = 302.1
           calculation = k_tilde(some_spectator_mass, some_electron_KE)  # uses the __call__ method in this class
        """
        self.alpha_1 = alpha_1
        self.mass_fraction = MassFraction(tritium_mass, electron_mass_eV / ATOMIC_MASS)
        self.reduced_momentum = ReducedMomentum(electron_mass_eV)

    def __call__(self, spectator_mass, electron_kinetic_energy):
        return self.alpha_1 * self.mass_fraction(spectator_mass) * self.reduced_momentum(electron_kinetic_energy)

所以這確實

    ktilde = Ktilde(alpha_1, spectator_masses, electron_mass)  # ktilde instance
    mass_spectator = parse_spectator_mass(args, parser)  # some function to get mass of spectator
    ktilde_value = ktilde(mass_spectator, args.energy)  # uses __call__ method of KTilde, args is some object (maybe from argparser) that has an energy attribute
    print('{:.4f}'.format(ktilde_value))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章