Ejemplo n.º 1
0
    def set_unitary(self, V):
        """Parse input and set the unitary operator attributes.
        This also sets up the potential function
        attributes in the process.
        """
        if isinstance(V, str):
            try:
                if V.strip().replace(".",
                                     "").replace("-",
                                                 "").replace("e",
                                                             "").isnumeric():
                    self.V_name = ""
                    self.V_latex = str(np.round(float(V), 2))
                    if float(V) == 0:
                        V = 1e-30
                        V_f = float(V) * np.ones([self.N])
                        self.U_t = UnitaryOperator1D(np.copy(V_f))
                        self.V_x = 0.0 * V_f
                    else:
                        V_f = scale(float(V) * np.ones([self.N]), 15)
                        self.V_x = V_f
                        self.U_t = UnitaryOperator1D(np.copy(V_f))
                        self.V_latex = "%sk" % (self.V_latex) if V_f[0] > 0\
                                       else " %sk" % (self.V_latex)
                    self.V_params = {}
                    self.V_base = None
                else:
                    V = V.replace("^", "**")
                    f = Function(V, "x")
                    self.V = lambda x: f(x, *f.get_tupled_default_values())
                    self.V_x = scale(self.V(self.x), 15)
                    self.V_name = str(f)
                    self.V_latex = "$" + f.multiply_latex_string("k") + "$"
                    self.U_t = UnitaryOperator1D(self.V)
                    self.V_base = f
                    self.V_params = f.get_enumerated_default_values()
            except (TypeError, AttributeError, SyntaxError, ValueError,
                    NameError) as E:
                print(E)
        elif isinstance(V, np.ndarray):
            self.V_params = {}
            self.V_base = None
            self.V = None
            self.V_x = scale(V, 15)
            self.V_name = "V(x)"
            self.V_latex = "$V(x)$"
            self.U_t = UnitaryOperator1D(V)
        else:
            print("Unable to parse input")

        if hasattr(self, "lines"):
            self.update_draw_potential()
Ejemplo n.º 2
0
 def set_wavefunction(self, psi, normalize=True):
     """Parse input to set the wavefunction attributes.
     """
     if isinstance(psi, str):
         try:
             if psi.strip().replace(".",
                                    "").replace("-",
                                                "").replace("e",
                                                            "").isnumeric():
                 psi_x = float(psi) * np.ones([self.N])
                 self.psi_name = psi
                 self.psi_latex = "$%s$" % psi
                 self.psi = Wavefunction1D(psi_x)
                 self._msg = "$\psi(x, 0) =$ %s" % self.psi_latex
                 self._msg_i = 45
                 if normalize:
                     self.psi.normalize()
                 self.psi_base = None
                 self.psi_params = {}
             else:
                 psi = psi.replace("^", "**")
                 f = Function(psi, "x")
                 self.psi_base = f
                 psi_func = lambda x: f(x, *f.get_tupled_default_values())
                 self.psi_name = str(f)
                 self.psi_latex = "$" + f.latex_repr + "$"
                 self.psi = Wavefunction1D(psi_func)
                 self.psi_params = f.get_enumerated_default_values()
                 self._msg = r"$\psi(x, 0) =$ %s" % self.psi_latex
                 self._msg_i = 45
                 if normalize:
                     self.psi.normalize()
         except (TypeError, AttributeError, SyntaxError, ValueError,
                 NameError) as E:
             print(E)
     elif isinstance(psi, np.ndarray):
         # self.psi_base = None
         # self.psi_params = {}
         self.psi = Wavefunction1D(psi)
         self.psi_name = "wavefunction"
         self.psi_latex = "$\psi(x)$"
         if normalize:
             self.psi.normalize()
     else:
         print("Unable to parse input")