Forma Expresión
La forma Expresión es el corazón matemático de todo modelo de Modellus. En ella defines las ecuaciones, los parámetros, las ecuaciones diferenciales, las recurrencias y las condiciones que hacen avanzar la simulación.
Visión general
Una forma Expresión contiene una o varias sentencias matemáticas escritas con una sintaxis parecida a LaTeX en un campo matemático de MathLive. Cada sentencia ocupa una línea. Todas las formas Expresión de un modelo comparten un único sistema de cálculo, así que los nombres de los términos deben ser únicos en todo el modelo, no solo en cada forma.
Leer una expresión
Cuando una forma contiene dos o más ecuaciones, se muestran como un único bloque con los signos igual alineados en una misma columna: los primeros miembros se alinean a la derecha contra el signo igual, los segundos miembros a la izquierda a continuación de él, y el bloque queda centrado en la tarjeta. Solo se alinea el signo igual principal de cada línea; un signo igual dentro de una condición, una fracción o un paréntesis se queda donde está. Una forma con una sola ecuación se muestra como siempre. La alineación es solo de presentación: el modelo sigue guardando una línea simple por cada ecuación.
Cada parte de una expresión se colorea según lo que significa:
- Variables — azul oscuro
- Números — naranja
- Operadores, relaciones y paréntesis — gris neutro
- Funciones como
sin,lnosqrt— verde - Derivadas —la
ddedx/dt, los signos de derivada parcial, las primas y los puntos de derivada— magenta - Subíndices calificadores, como la
cdeK_c— azul claro - Índices de iteración, como la
ndex_n— morado - Los términos con los que avanza el modelo —el término independiente
ty el término de iteraciónncuando aparecen solos— morado, el mismo color que ya tienen como índice - Filas que el modelo no puede leer — rojo, y marcadas en el lugar donde están (ver más abajo)
Cuando el modelo no puede leer una fila, la propia tarjeta te lo dice, sin esconderlo tras un aviso al pasar el ratón. La fila se escribe en rojo y lleva una banda que la cruza, la tarjeta se enmarca en rojo para que la distingas desde el otro lado de la pizarra y un panel al pie de la tarjeta explica el motivo, en el mismo idioma que el resto del editor. Donde a la fila le falta algo —un valor, un paréntesis—, se dibuja un hueco punteado en el lugar que le corresponde, igual que el hueco sin rellenar de una plantilla; si lo que falta está dentro de una fracción o de una raíz, se subraya esa fracción o esa raíz, porque no se puede señalar el lugar con más precisión que el símbolo que lo contiene. Un símbolo que no puede ir donde se ha escrito se subraya allí mismo. El panel se abre cada vez que te acercas a la tarjeta —con el puntero encima, con la tarjeta seleccionada o con el cursor dentro— y muestra solo los avisos, sin título encima y sin nombrar la fila delante de cada uno: al señalar un aviso se ilumina la fila a la que corresponde y, al hacer clic en él, el cursor se coloca allí. Las filas se comprueban a medida que escribes, no solo cuando sales, salvo la fila en la que está el cursor: una fila está a medio escribir mientras la estás escribiendo, así que no se revisa hasta que la dejas.
Los colores indican una familia, no un tono fijo. Cada uno se toma de los tokens del tema --math-* y después se ajusta a la tarjeta sobre la que se pinta: el tono se mantiene, la luminosidad cambia hasta que el texto destaca con claridad sobre el fondo y, a la vez, el color se intensifica. Una tarjeta blanca recibe colores profundos y saturados; una tarjeta negra o gris oscuro, colores brillantes; si cambias el color de la tarjeta, la expresión se vuelve a pintar al instante. Todos los colores mantienen al menos el contraste que piden las pautas de accesibilidad, y los operadores quedan un grado más discretos que las variables. El cursor y el resaltado de la selección siguen la misma regla, igual que el color del texto de la tarjeta, que es con el que se dibujan los paréntesis, las rayas de fracción y los signos de raíz: se deja exactamente como lo elegiste y solo se aclara cuando, si no, la tarjeta lo haría desaparecer. Nada de esto llega al modelo: una expresión guardada o copiada nunca lleva color.
Barra de herramientas
La barra de herramientas aparece al seleccionar una forma Expresión. Te ofrece:
- Selector de color — Cambia el color de acento de la forma
- Selector de atajos — Inserta rápidamente plantillas matemáticas habituales
- Eliminar — Quita la forma de la pizarra
Tipos de sentencia
Cada línea de una forma Expresión se interpreta como uno de estos tipos de sentencia:
| Tipo | Sintaxis | Ejemplo | Descripción |
|---|---|---|---|
| Parámetro | name = value |
g = 9.8 |
Un valor constante. No depende de otros términos ni de la variable independiente. |
| Función | name = expression |
E = ½·m·v² |
Un valor calculado que depende de otros términos o de la variable independiente. |
| Diferencial | dx/dt = expression |
dx/dt = v |
Ecuación diferencial ordinaria de primer orden. Necesita un valor inicial en las propiedades de la forma. |
| Recurrencia | x_{n} = expression |
x_{n} = x_{n-1} + v·Δt |
Definición paso a paso. El subíndice indica el desfase en pasos. |
| Condicional | name = \begin{cases}...\end{cases} |
v = { 0 & t=0 \\ a·t & otherwise } |
Definición a trozos. Necesita al menos dos ramas. |
| Función con argumento | f(t) = expression |
h(t) = v₀·t - ½·g·t² |
Notación con el argumento explícito (solo estética; se comporta igual que una Función). |
| Visualización | expression |
F = ma |
Solo una etiqueta visual. La calculadora no la calcula. |
Operadores aritméticos
| Operador | LaTeX | Tecla | Descripción |
|---|---|---|---|
| Suma | + | + | Suma de dos expresiones |
| Resta | - | - | Diferencia de dos expresiones |
| Multiplicación | \cdot | * | Multiplicación explícita (símbolo ·) |
| Multiplicación implícita | 2x | 2x | Coeficiente seguido de un nombre o un paréntesis |
| División en línea | / | / | Notación a/b en línea |
| Fracción | \frac{a}{b} | / (en posición de numerador) | Fracción vertical con calidad de presentación |
| Potencia | ^{n} | ^ | Potenciación |
| Factorial | x! | ! | Factorial en notación posfija para enteros no negativos |
| Raíz cuadrada | \sqrt{x} | \sqrt | Raíz cuadrada |
| Cambio de signo | -x | - | Opuesto (signo menos unario) |
Nota sobre el factorial: el factorial usa notación posfija (n!) y está pensado para valores enteros no negativos.
Operadores de comparación
Se usan en las ramas de las condiciones (\begin{cases}):
| Operador | LaTeX | Significado |
|---|---|---|
| = | = | Igual a |
| > | > | Mayor que |
| < | < | Menor que |
| ≥ | \ge o \geq | Mayor o igual que |
| ≤ | \le o \leq | Menor o igual que |
| ≠ | \neq | Distinto de |
Las condiciones se pueden encadenar (por ejemplo, 0 < x < 1) o combinar con \lor (O) y \land (Y). La palabra clave \text{otherwise} hace de rama «en otro caso».
Funciones incorporadas
| Categoría | Función | LaTeX | Argumentos |
|---|---|---|---|
| Trigonométricas | Seno | \sin\left(x\right) | 1 |
| Coseno | \cos\left(x\right) | 1 | |
| Tangente | \tan\left(x\right) | 1 | |
| Cotangente | \cot\left(x\right) | 1 | |
| Secante | \sec\left(x\right) | 1 | |
| Cosecante | \csc\left(x\right) | 1 | |
| Trigonométricas inversas | Arcoseno | \arcsin\left(x\right) | 1 |
| Arcocoseno | \arccos\left(x\right) | 1 | |
| Arcotangente | \arctan\left(x\right) | 1 | |
| Hiperbólicas | Seno hiperbólico | \sinh\left(x\right) | 1 |
| Coseno hiperbólico | \cosh\left(x\right) | 1 | |
| Tangente hiperbólica | \tanh\left(x\right) | 1 | |
| Logarítmicas | Logaritmo neperiano | \ln\left(x\right) | 1 |
| Logaritmo decimal | \log\left(x\right) | 1 | |
| De dos argumentos | Máximo | \max\left(a, b\right) | 2 |
| Mínimo | \min\left(a, b\right) | 2 | |
| Resto (módulo) | \mod\left(a, b\right) | 2 | |
| Utilidades | Signo | sign\left(x\right) | 1 — devuelve -1, 0 o 1 |
| Aleatorio | rnd\left(x\right) | 1 — número decimal aleatorio en [0, x] | |
| Entero aleatorio | irnd\left(x\right) | 1 — número entero aleatorio en [0, x] | |
| Parte entera | int\left(x\right) | 1 — trunca a un entero | |
| Redondeo | round\left(x\right) | 1 — redondea al entero más próximo | |
| Otras | Determinante | \det\left(x\right) | 1 |
\left( y \right). Los paréntesis simples no son válidos en las llamadas a funciones. El campo matemático los inserta automáticamente.
Constantes
| Nombre | LaTeX | Valor |
|---|---|---|
| Pi | \pi | 3.14159… |
| Número e | e o \E | 2.71828… |
g no es una constante incorporada. Defínela como parámetro: g = 9.8.
Sintaxis especial
Diferencia finita (Δ)
| Sintaxis | Significado |
|---|---|
\Delta x | x(actual) − x(anterior). Para la variable independiente: el tamaño del paso. |
\Delta\left(expr\right) | Diferencia finita aplicada a una subexpresión. |
Subíndices (referencias a pasos)
| Sintaxis | Significado |
|---|---|
x_{n-1} | Valor de x en la iteración anterior |
x_{n} | Iteración actual (primer miembro de una recurrencia) |
x_0 | Valor inicial de x (dígito suelto, sin llaves) |
x_{0} | Valor inicial (forma con llaves) |
Términos indexados (referencias a elementos)
Un término puede representar muchos valores a la vez —por ejemplo, los osciladores de una onda— si se define sobre un índice de elemento en lugar de sobre el tiempo. El índice queda ligado por la asignación, así que nunca se convierte en una variable del modelo:
y\left[i\right] = A\cdot\cos\left(k\cdot i - \omega\cdot t\right)
| Sintaxis | Significado |
|---|---|
y\left[i\right] = … | Define y sobre índices de elemento; el segundo miembro se evalúa una vez por cada elemento que se pide |
y\left[3\right] | Elemento 3 de y |
y\left[i\right] | Elemento i, donde i es cualquier expresión |
s = y + z | Superposición: s también es indexado y se suma elemento a elemento |
Es un tercer espacio de índices, además de los dos anteriores: y_3 lee y en la iteración 3 y y\left(3\right) la lee cuando la variable independiente vale 3, mientras que solo los corchetes leen un elemento. Un término indexado no tiene un único valor, así que se leen sus elementos en lugar de mostrarse como un número.
El objeto Osciloscopio los lee: escribe los términos indexados en sus Ondas y cada uno se dibuja a lo largo de su retícula, una traza por fila. Dos ondas viajeras sumadas así —una con -\omega\cdot t y otra con +\omega\cdot t— dan una onda estacionaria con nodos fijos. Un Piano publica uno: el acorde que está sonando, un elemento por muestra.
El objeto Onda mecánica funciona, en cambio, con un término simple. Escribe en su fila Onda un término que el propio modelo calcule —y=A\cdot\sin\left(\omega\cdot t\right)— y la cadena repite lo que ese término ha ido haciendo: en cada iteración entrega al primer oscilador el valor que el término acaba de tomar y desplaza un puesto el que tenía antes, de modo que la cadena guarda los últimos valores de la ejecución, los más antiguos en el extremo, y el movimiento la recorre a medida que avanza la ejecución. Guarda un valor por oscilador, así que Muestras indica también hasta dónde llega hacia atrás. Si escribes un nombre que el modelo no define, el objeto funciona al revés: calcula su onda a partir de su amplitud, frecuencia, velocidad y fase, y entrega al modelo, con ese nombre, lo que hace su oscilador de referencia. El nombre pasa a ser un término del modelo —aparece en todas las listas de términos, igual que un nombre que el modelo asigna—, así que puedes representarlo frente al tiempo, usarlo en una definición (z=2\cdot y) y sumarlo a la lectura de otro objeto (s=forward+back). Un nombre que el modelo sí define pertenece al modelo —una asignación, sobre el tiempo o sobre índices de elemento, se lee en lugar de sobrescribirse—, y un objeto que quitas de la pizarra se lleva su término con él.
Anotación de unidades
Añade unidades, solo de visualización, después de cualquier sentencia:
v = 10 \quad\textcolor{gray}{\mathrm{m/s}}
Las unidades son solo estéticas: el motor no las comprueba ni las convierte.
Nombres con punto (referencias a formas contenidas)
Haz referencia a términos de las formas contenidas en un sistema de referencia: body.x, particle.velocity.
Atajos de teclado
El campo matemático de MathLive admite estos atajos de teclado para escribir más rápido:
| Acción | Atajo | Resultado |
|---|---|---|
| Abrir la paleta de plantillas | ⌘. (macOS) · Ctrl+. (Windows/Linux) | Elige una plantilla matemática en la paleta compacta |
| Potencia (superíndice) | ^ | |
| Subíndice (índice) | _ | |
| Cambio de signo | ~ | |
| Factorial | ! | |
| Raíz cuadrada | # | |
| Delta | % | |
| Valor absoluto | | | |
| Distinto | <> | |
| Mayor o igual | >= | |
| Menor o igual | <= | |
| Condición (a trozos) | \ | |
| O | ⌥v (macOS) · Alt+v (Windows) | |
| Y | ⌥^ (macOS) · Alt+^ (Windows) | |
| Plantilla de derivada | ⌥/ (macOS) · Alt+/ (Windows) | |
| Redondeo por defecto | ⌥_ (macOS) · Alt+_ (Windows) | |
| Redondeo por exceso | ⌘_ (solo macOS) | |
| Fracción | ⌘/ (macOS) · Ctrl+/ (Windows) | |
| Punto de multiplicación | * | |
| Nueva línea (nueva sentencia) | Enter | — |
| Salir / siguiente hueco | Tab | — |
Selector de atajos
Mientras editas, pulsa ⌘. en macOS o Ctrl+. en Windows/Linux para abrir la paleta de atajos. También puedes abrirla con el botón de la barra de herramientas.
- Ecuaciones diferenciales (dx/dt = ..., atajo: ⌥ + / en macOS, Alt + / en Windows)
- Recurrencias (x_n = x_{n-1} + ...)
- Funciones definidas a trozos
- Plantilla de redondeo por defecto
\lfloor x\rfloor - Plantilla de redondeo por exceso
\lceil x\rceil - Fórmulas de física habituales
- Identidades trigonométricas
Notación de integrales
Puedes escribir integrales con notación LaTeX, como \int_{a}^{b} f\left(x\right)\,\mathrm{d}x. Para obtener la parte entera, usa la función de utilidad int\left(x\right).
Panel de propiedades
Cuando seleccionas una forma Expresión, el panel de propiedades muestra:
| Propiedad | Descripción |
|---|---|
| Variable independiente | La variable de la iteración (por defecto: t) |
| Paso | El incremento en cada iteración (Δt) |
| Inicio / Fin | Intervalo de la variable independiente |
| Valores iniciales | Valores de partida de las ecuaciones diferenciales y las recurrencias |
| Escenarios | Varios conjuntos de valores iniciales para estudiar el efecto de los parámetros |
Ejemplos
Cinemática sencilla
g = 9.8
v₀ = 20
θ = 45
vx = v₀·\cos\left(θ\right)
vy = v₀·\sin\left(θ\right) - g·t
\frac{dx}{dt} = vx
\frac{dy}{dt} = vy
Crecimiento de una población (recurrencia)
r = 0.05
P_{n} = P_{n-1}·\left(1 + r\right)
Velocidad definida a trozos
v = \begin{cases} 0 & t = 0 \\ a·t & 0 < t < 5 \\ a·5 & \text{otherwise} \end{cases}