Mostrando entradas con la etiqueta GNU MAXIMA. Mostrar todas las entradas
Mostrando entradas con la etiqueta GNU MAXIMA. Mostrar todas las entradas

sábado, 10 de junio de 2023

Superficie en forma de silla de montar representada con GNU MAXIMA

Representemos la función de dos variables reales: $f(x,y)=-x^2+y^2$ para comprobar que tiene la forma anunciada en el título de la entrada:

(%i19)	
    plot3d(-x^2 + y^2, [x, -3, 3], [y,-2,2],[legend, false]);

$\diamond$

-oOo-

Utilidades:

  [1] GNU MAXIMA

miércoles, 7 de junio de 2023

Cosas que pasan cuando se empieza a trabajar con una herramienta CAS

Un ejemplo con GNU MAXIMA:

(%i1)	/* Habiendo asignado un valor concreto a la variable
	x ...*/
	x:3$
	
(%i2)	/* Quiero calcular, a continuación, la derivada 
	de una función, de variable x, por ejemplo ... */
	diff(x^2+x+1,x);
    
	/* y me encuentro con el siguiente problema: 
    MAXIMA nos dice ... */
    
       diff: second argument 
       must be a variable; found 3
       -- an error. 
       To debug this try: debugmode(true);

(%i3)	/* Para solucionarlo (no hace falta entrar en el modo
        depuración de código), basta con borrar la asignación
	    de valor que, en un principio 
        había realizado a la variable */ 
    
	kill(x)$

(%i4)	/* Ahora sí podré obtener la derivada ...*/
	diff(x^2+x+1,x);

(%o4)	2*x+1

$\diamond$

-oOo-

Utilidades:

  [1] GNU MAXIMA

martes, 6 de junio de 2023

Un ejercicio con matrices del tipo triangular inferior

ENUNCIADO. Sean $a,b,c,d$ números reales, la matriz triangular inferior $A=\begin{pmatrix}a&0\\ b&a\end{pmatrix}$ no nula y la matriz triangular inferior $B=\begin{pmatrix}c&0\\ d&c\end{pmatrix}$ no nula (nótese que los elementos de las diagonales principales son tales que $A_{11}=A_{22}=a$ y $B_{11}=B_{22}=c$). Compruébese que, así definidas, las matrices $A$ y $B$ conmutan.

SOLUCIÓN. Los cálculos simbólicos los he realizado con ayuda de la herramienta CAS, GNU MAXIMA [1]

(%i28)	A:matrix( [a,0],[b,a]   ); /* Defino una matriz genérica A */
(%o28)	matrix(
		[a,	0],
		[b,	a]
	)
(%i29)	B:matrix( [c,0],[d,c]   ); /* Defino una matriz genérica B */
(%o29)	matrix(
		[c,	0],
		[d,	c]
	)
(%i30)	is(A.B=B.A); /* Compruebo si conmutan. Nótese que en MAXIMA 
                      es necesario usar el punto bajo (.)
                      para la multiplicación de matrices 
                      en lugar del punto elevado (·), pues éste
                      multiplica elemento a elemnto; tal cosa
                      da lugar a muchas confusiones */
(%o30)	true /* en efecto, así es */


(%i31)	A.B; /* Observo el por qué */
(%o31)	matrix(
		[a*c,	0],
		[a*d+b*c,	a*c]
	)
(%i32)	B.A;
(%o32)	matrix(
		[a*c,	0],
		[a*d+b*c,	a*c]
	)
(%i33)	A.B-B.A;
(%o33)	matrix(
		[0,	0],
		[0,	0]
	)
$\diamond$

-oOo-

Utilidades:

  [1] GNU MAXIMA

martes, 20 de diciembre de 2022

Cálculo de la matriz canónoca de Jordan de la matriz de un endomorfismo mediante el uso de GNU Maxima

En este artículo expongo un sencillo ejemplo de cálculo de la matriz canónica de Jordan (en la base adecuada) de la matriz dada (referida a la base canónica) de un cierto endomorfismo, empleando las utilidades de GNU Maxima, que es una buena herramienta CAS para este tipo de trabajos.


$\diamond$

-oOo-

Referencias

[1] L. Merino; E. Santos, Álgebra Lineal con métodos elementales, Paraninfo-Thomson, Madrid, 2007
[2] E. Hernández, Álgebra y geometría, Addison-Wesley/UAM, Madrid, 1994
[3] S. Xambó, Álgebra lineal y geometrías lineales, Eunibar, Barcelona, 1977
[4] J.F. Fernando; J.M. Gamboa; J.M. Ruiz, Álgebra lineal (vol. 2), Sanz y Torres, Madrid, 2010
[5] Documentación oficial en la red Internet sobre el uso de GNU Maxima, https://maxima.sourceforge.io/documentation.html

jueves, 25 de agosto de 2022

Divisors d'un nombre enter no negatiu. Un exercici de programació amb l'eina GNU MAXIMA

    Si us agrada programar una mica és un bon exercici escriure una senzilla línia d'instruccions amb MAXIMA per escriure la llista de nombres divisors d'un nombre enter no negatiu donat:
    (%i1) for i:1 thru 30 do (if mod(30,i)=0 then print(i));
Obtindrem ràpidament tots el divisors: {1, 2, 3, 5, 6, 10, 15, 30}
Potser convindreu que no té molt d'interès perquè, de fet, el nombre que hem posat és molt petit. Ara bé, i si fos, posem pel cas, 1452 ? Deu n'hi do de la feinada que tindrem si ho fem amb paper i llapis, fins i tot, fent-ho d'una manera exhaustiva amb l'ajut d'un diagrama d'arbre tal com vaig explicar en un article anterior. Modificant la dada, obtindrem el resultat amb un dit i fet
    (%i2) for i:1 thru 1452 do (if mod(1452,i)=0 then print(i));
... 1 2 3 4 6 11 12 22 33 44 66 121 132 242 363 484 726 1452

I encara molt millor si escrivim una funció amb un paràmetre d'entrada per no haver d'escriure cada vegada la instrucció repetitiva:

    (%i3) troba_divisors(n):=(
for i:1 thru n do (if mod(n,i)=0 then print(i))
)$


Funció que farem servir concretant el nombre del qual volem trobar els divisors:

    (%i4) troba_divisors(235456);

Aquest és el resultat del càlcul:
1 2 4 8 13 16 26 32 52 64 104 208 283 416 566 832 1132 2264 3679 4528 7358 9056 14716 18112 29432 58864 117728 235456

Val a dir, però, que MAXIMA disposa ja d'una funció predefinida divisors(). No cal programar-ne un altra. El que m'ha mogut a escriure-la és només per exposar un exercici elemental de programació. La funció predefinida és més eficaç que la que he escrit perquè l'algorisme emprat per MAXIMA és molt millor. Comproveu-ho. Us adonareu que el resultat amb la funció divisors() s'obté molt més ràpidament i, a més, estructurat com una llista:


    (%i5) divisors(235456);

    (%o5){1,2,4,8,13,16,26,32,52,64,104,208,283,416,566,832,
1132,2264,3679,4528,7358,9056,14716,18112,29432,58864,117728,235456}

$\diamond$

lunes, 27 de diciembre de 2021

Números complejos con GNU MAXIMA

  • [ 1 | 2 | 3 ]

Programación con GNU MAXIMA


Estadística descriptiva de una variables con GNU MAXIMA


Desarrollo de Taylor de funciones con GNU Maxima

Cálculo de integrales indefinidas y definidas con GNU MAXIMA

Cálculo de límites con GNU MAXIMA

Listas y conjuntos con GNU MAXIMA



Archivos y listas con GNU MAXIMA


Multiplicación de matrices con MAXIMA

lunes, 13 de diciembre de 2021

Introducción al cálculo simbólico con GNU MAXIMA

Una bona manera d'engrescar-nos en la manipulació simbòlica fent ús d'un eina CAS es començar a fer unes proves ben senzilles. Vegeu a continuació un exemple.

Els primers passos programan amb GNU MAXIMA

Els primers passos programant amb MAXIMA
Primera cosa ...

Editem la funció que anomenem "programa_extremadament_senzill"
(%i5) programa_extremadament_senzill():=
(print("hola")
)$
Depurem els possibles errors i fem actuar la funció escrivint l'entrada
(%i6) programa_extremadament_senzill();
Obtenint ...
hola
(%o6) hola

Observem que les entrades de l'usuari es designen amb el símbol del sistema %i i les sortides amb el símbol %o, convenientment numerades.

Exemple 1 (totes les variables són globals)

(%i3) programa_senzill_1(a,b):=
(
s:a+b,
print("suma de a i b =",s)
)$
(%i4) programa_senzill_1(2,3);
suma de a i b = 5
(%o4) 5


Exemple 2 (els paràmetres d'entrada a i b són variables globals, mentre que el resultat s és una variable local)

(%i1) programa_senzill_2():=
block([s],
a:read("entreu el primer sumand"),
b:read("entreu el segon sumand"),
s:a+b,
print("suma de a i b =",s)
)$

(%i2) programa_senzill_2();
entreu el primer sumand 1;
entreu el segon sumand 2;
suma de a i b = 3
(%o2) 3

Observem que les variables locals d'una funció (aquí, "programa_senzill_2") - en aquest, l'única variable local és s - apareixen, després de block( entre claudàtors - block([s],... -, separades per comes si n'hi ha més d'una. El parèntesi "(" amb què hem començat el "block" - "block(" - cal tancar-lo necessàriament al final. El símbol de l'acabament "$" indica a l'interpret que no volem eco del sistema - llevat de la comunicació dels possibles errors - un cop hàgim validat la funció

Exemple 3 (totes les variables són locals)

(%i1) programa_senzill_3():=
block([s,
a:read("entreu el primer sumand"),
b:read("entreu el segon sumand")],
s:a+b,
print("suma de a i b =",s)
)$

(%i2) programa_senzill_3();
entreu el primer sumand 1;
entreu el segon sumand 2;
suma de a i b = 3
(%o2) 3

Treballant amb fitxers de funcions que prèviament hem programat
Podem fer servir un bloc de notes per editar codi font de les funcions
que volem fer servir en una sessió de càlcul amb MAXIMA, a més, naturalment,
de les moltes que ja té incorporades. A mode d'exemple,
he escrit el codi de dues funcions molt simples,
funcio_que_multiplica() i funcio_potencial(), en un mateix fitxer de text amb extensió .mac: prod.mac
Juntament amb el codi font de les funcions, podem posar comentaris abastant una o vàries línies, a l'estil de C o Java; per exemple, /* això només és un comentari */, és a dir, obrint amb "/*" i tancant amb "*/"

(contingut del fitxer prod.mac)

/* multiplicació de dos nombres */
funcio_que_multiplica():=
block([p,
a:read("entreu el primer factor"),
b:read("entreu el segon factor")],
p:a*b,
print("a x b =",p)
)

/* potència de dos nombres */
funcio_potencial():=
block([w,
a:read("entreu la base de la potència"),
b:read("entreu l'exponent")],
w:a^b,
print("a^b =",w)
)


Per fer ús d'aquest fitxer amb les funcions que hem programat, carreguem el fitxer prod.mac des d'una sessió de MAXIMA
(%i8) load("e:/taller_maxima/ex_160807/prod.mac");
(%o8) e:/taller_maxima/ex_160807/prod.mac

I, si s'escau, després de depurar el codi, emprem les funcions que conté:

(%i9) funcio_que_multiplica();
entreu el primer factor 4;
entreu el segon factor 2;
a x b = 8
(%o9) 8

(%i10) funcio_potencial();
entreu la base de la potència 2;
entreu l'exponent 3;
a^b = 8
(%o10) 8

Ejemplos de gráficas con GNU MAXIMA

Ejemplo de uso de Gráficas de funciones con MAXIMA
Consideremos el problema de resolver la ecuación trascendente $\sin{x}+x^2=0$, esto es, el de resolver la ecuación $\sin{x}=-x^2$,
que podemos resolver, de forma aproximada, representado las gráficas de las funciones de ambos miembros, encontrando los puntos de intersección:
(%i7) plot2d ([sin(x),-x^2], [x, -2*%pi, 2*%pi])


Ejemplo de gràfics de superficies con MAXIMA
Sea una superficie en $\mathbb{R}^3$ como, por ejemplo, la bada de Möbius; podemos visualizarla tecleando:
(%i1) plot3d([cos(x)*(3+y*cos(x/2)),sin(x)*(3+y*cos(x/2)),y*sin(x/2)],[x,-%pi,%pi],[y,-1,1],[grid,50,15]);