Actualización del historial de cálculos con nuevas variables para el cálculo de velocidad. Se añaden definiciones para 'valor', 'k' y 'valor_mmS', mejorando la gestión de unidades en el sistema.
This commit is contained in:
parent
6bf43bf974
commit
6ebc81d0b9
|
@ -1 +1,5 @@
|
||||||
plot(sin(x), (x, 0, 1))
|
valor = 500
|
||||||
|
k = valor * symbols('Hz') / symbols('mmS')
|
||||||
|
|
||||||
|
valor_mmS = 100 * symbols('mmS')
|
||||||
|
speed = k * valor_mmS
|
|
@ -0,0 +1,153 @@
|
||||||
|
"""
|
||||||
|
Clase para símbolos SymPy - Tokenización automática de corchetes
|
||||||
|
Convierte [texto] automáticamente a symbols('texto')
|
||||||
|
|
||||||
|
EJEMPLOS DE USO:
|
||||||
|
k = 100 * [Hz] → k = 100 * symbols('Hz')
|
||||||
|
E = [m] * [c]**2 → E = symbols('m') * symbols('c')**2
|
||||||
|
f = [omega] / (2*[pi]) → f = symbols('omega') / (2*symbols('pi'))
|
||||||
|
|
||||||
|
CARACTERÍSTICAS:
|
||||||
|
- Tokenización automática de [nombre] a symbols('nombre')
|
||||||
|
- Integración completa con SymPy para álgebra simbólica
|
||||||
|
- Soporte para operaciones matemáticas completas
|
||||||
|
- Prioridad alta en el sistema de tokenización
|
||||||
|
"""
|
||||||
|
from app.sympy_Base import SympyClassBase
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
class SymPySymbol(SympyClassBase):
|
||||||
|
"""
|
||||||
|
Wrapper para símbolos de SymPy con tokenización automática de corchetes
|
||||||
|
|
||||||
|
Esta clase permite usar la sintaxis [nombre] como shortcut para symbols('nombre'),
|
||||||
|
mejorando significativamente la experiencia de usuario para trabajo algebraico.
|
||||||
|
|
||||||
|
Uso: [Hz] se convierte automáticamente a symbols('Hz')
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, symbol_name):
|
||||||
|
"""Inicialización del símbolo SymPy"""
|
||||||
|
from sympy import symbols
|
||||||
|
|
||||||
|
if isinstance(symbol_name, str):
|
||||||
|
self.symbol_name = symbol_name
|
||||||
|
self.symbol = symbols(symbol_name)
|
||||||
|
else:
|
||||||
|
raise TypeError(f"SymPySymbol requiere un string, recibido: {type(symbol_name)}")
|
||||||
|
|
||||||
|
# Llamar al constructor base
|
||||||
|
super().__init__(self.symbol, str(self.symbol))
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
"""Representación string"""
|
||||||
|
return str(self.symbol)
|
||||||
|
|
||||||
|
def _sympystr(self, printer):
|
||||||
|
"""Representación SymPy string"""
|
||||||
|
return str(self.symbol)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"Symbol({self.symbol_name})"
|
||||||
|
|
||||||
|
# ========== DELEGACIÓN DE OPERADORES A SYMPY ==========
|
||||||
|
|
||||||
|
def __add__(self, other):
|
||||||
|
"""Suma delegada al símbolo SymPy"""
|
||||||
|
return self.symbol + other
|
||||||
|
|
||||||
|
def __radd__(self, other):
|
||||||
|
return other + self.symbol
|
||||||
|
|
||||||
|
def __sub__(self, other):
|
||||||
|
"""Resta delegada al símbolo SymPy"""
|
||||||
|
return self.symbol - other
|
||||||
|
|
||||||
|
def __rsub__(self, other):
|
||||||
|
return other - self.symbol
|
||||||
|
|
||||||
|
def __mul__(self, other):
|
||||||
|
"""Multiplicación delegada al símbolo SymPy"""
|
||||||
|
return self.symbol * other
|
||||||
|
|
||||||
|
def __rmul__(self, other):
|
||||||
|
return other * self.symbol
|
||||||
|
|
||||||
|
def __truediv__(self, other):
|
||||||
|
"""División delegada al símbolo SymPy"""
|
||||||
|
return self.symbol / other
|
||||||
|
|
||||||
|
def __rtruediv__(self, other):
|
||||||
|
return other / self.symbol
|
||||||
|
|
||||||
|
def __pow__(self, other):
|
||||||
|
"""Potencia delegada al símbolo SymPy"""
|
||||||
|
return self.symbol ** other
|
||||||
|
|
||||||
|
def __rpow__(self, other):
|
||||||
|
return other ** self.symbol
|
||||||
|
|
||||||
|
# ========== MÉTODOS ESTÁTICOS ==========
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def Helper(input_str):
|
||||||
|
"""Ayuda contextual para símbolos"""
|
||||||
|
if re.search(r'\[.*\]', input_str):
|
||||||
|
return ('Uso: [Hz] se convierte automáticamente a symbols("Hz")\n'
|
||||||
|
'Para unidades físicas, frecuencias, variables simbólicas, etc.\n'
|
||||||
|
'Ejemplos: [x], [omega], [pi], [Hz], [m], [c]')
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def PopupFunctionList():
|
||||||
|
"""Lista de métodos sugeridos para símbolos"""
|
||||||
|
return [
|
||||||
|
("subs", "Sustituir valores: symbol.subs(x, valor)"),
|
||||||
|
("expand", "Expandir expresión"),
|
||||||
|
("simplify", "Simplificar expresión"),
|
||||||
|
("factor", "Factorizar expresión"),
|
||||||
|
("solve", "Resolver ecuaciones"),
|
||||||
|
]
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_tokenization_patterns():
|
||||||
|
"""
|
||||||
|
Define la regla de tokenización principal: [texto] → symbols('texto')
|
||||||
|
|
||||||
|
PATRÓN: \[([a-zA-Z_][a-zA-Z0-9_]*)\]
|
||||||
|
- Captura texto entre corchetes que empiece con letra o _
|
||||||
|
- Permite números después del primer carácter
|
||||||
|
- Convierte a llamada symbols() automáticamente
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List[Dict]: Lista de reglas de tokenización
|
||||||
|
"""
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
'pattern': r'\[([a-zA-Z_][a-zA-Z0-9_]*)\]',
|
||||||
|
'replacement': lambda match: f'symbols("{match.group(1)}")',
|
||||||
|
'priority': 10, # ALTA prioridad - muy específico y común
|
||||||
|
'description': 'Símbolos con corchetes: [Hz], [x], [omega] → symbols("Hz"), etc.'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# ========== FUNCIÓN DE REGISTRO ==========
|
||||||
|
|
||||||
|
def register_classes_in_module():
|
||||||
|
"""
|
||||||
|
Registra la clase SymPySymbol en el sistema de tipos
|
||||||
|
|
||||||
|
Configuración:
|
||||||
|
- add_lowercase: True (permite sympysymbol() además de SymPySymbol())
|
||||||
|
- supports_brackets: False (los corchetes se manejan vía tokenización)
|
||||||
|
- Integración automática con el sistema de tokenización distribuida
|
||||||
|
"""
|
||||||
|
return [
|
||||||
|
("SymPySymbol", SymPySymbol, "SympyClassBase", {
|
||||||
|
"add_lowercase": True,
|
||||||
|
"supports_brackets": False, # Los corchetes se manejan vía tokenización
|
||||||
|
"description": "Símbolos SymPy con tokenización automática de corchetes [nombre]"
|
||||||
|
}),
|
||||||
|
]
|
Loading…
Reference in New Issue