Skip to content

Instantly share code, notes, and snippets.

@Observatorio-de-Matematica
Created January 17, 2024 22:13
Show Gist options
  • Save Observatorio-de-Matematica/ed99576d572662acf74b1a671c5a9630 to your computer and use it in GitHub Desktop.
Save Observatorio-de-Matematica/ed99576d572662acf74b1a671c5a9630 to your computer and use it in GitHub Desktop.
/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/
/* [ Created with wxMaxima version 22.04.0 ] */
/* [wxMaxima: title start ]
Examen B-II
[wxMaxima: title end ] */
/* [wxMaxima: comment start ]
Este es uno de los tipos de examen de prácticas del día 21 de diciembre.
He de agradecer al alumno Antonio Jiménez Martínez, del grupo
1ºB del Grado en Ingeniería Informática, su amabilidad por cederme
sus soluciones para que estén a disposición de todos sus compañeros.
[wxMaxima: comment end ] */
/* [wxMaxima: section start ]
Ejercicio1:
Se considera la ecuación 2+tan(x^2-3x+1)=e^{1-x^2}.
(a) Dibuja en un mismo gráfico los dos miembros
de la ecuación dada. Y calcula el punto de
corte de ambas gráficas en el intervalo [0,1].
(b) Utiliza el método de bisección (con un error de 10^{-8}
y una precisión de 10^{-9})
para calcular
la solución de dicha ecuación en el intervalo
[0,1]. ¿En qué paso del bucle se encuentra la solución?
[wxMaxima: section end ] */
/* [wxMaxima: subsect start ]
(a)
[wxMaxima: subsect end ] */
/* [wxMaxima: comment start ]
En primer lugar, nos aseguramos de trabajar en numérico:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
numer:true;
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Presentamos las funciones que constituyen los dos miembros de la
ecuación dada:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
f(x):=2+tan(x^2-3*x+1);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
g(x):=%e^(1-x^2);
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Y dibujamos, en un mismo gráfico, ambas curvas:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
plot2d([f(x),g(x)], [x,0,1])$
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Creamos una función llamada h(x)=f(x)-g(x) y calculamos su cero con "find_root".
El comando solve no funciona para este tipo de ecuaciones.
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
h(x):=2+tan(x^2-3*x+1)-%e^(1-x^2);
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Este es el punto de corte de las dos gráficas respecto a abscisas:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
find_root(h(x),x,0,1);
/* [wxMaxima: input end ] */
/* [wxMaxima: subsect start ]
(b)
[wxMaxima: subsect end ] */
/* [wxMaxima: comment start ]
Cargamos el método de bisección:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
biseccion2(expr,var,ext_inf,ext_sup):=
block(
[a,b,c,err:10^(-8),prec:10^(-9)],
a:ext_inf,
b:ext_sup,
/* extremos del intervalo */
/* número de pasos */
local(log2,f),
define(log2(x),log(x)/log(2)),
define(f(x),subst(x,var,expr)),
pasos:ceiling(log2((b-a)/err)),
/* comprobamos las condiciones iniciales */
if f(a)*f(b)>0 then error("Error: no hay cambio de signo"),
/* ¿se alcanza la solución en los extremos? */
if abs(f(a)) < prec then return(a),
if abs(f(b)) < prec then return(b),
for i:1 thru pasos do
(j:i,
c:(a+b)/2,
if abs(f(c))< prec then return ([j,c]),
if f(a)*f(c)< 0 then b:c else a:c
),
[j,c])$
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Y lo aplicamos a la función h(x).
[wxMaxima: comment end ] */
/* [wxMaxima: comment start ]
Calculamos la solución y el paso en el que se encuentra, este es el paso 27.
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
biseccion2(h(x),x,0,1);
/* [wxMaxima: input end ] */
/* [wxMaxima: section start ]
Ejercicio2:
Programa el método de la regula falsi en n pasos con una
precisión similar al método de bisección
empleado en el ejercicio anterior.
Aplícalo para resolver la ecuación x^3=11.
[wxMaxima: section end ] */
/* [wxMaxima: comment start ]
Cargamos el método de la regula falsi:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
regulafalsi(expr,var,ext_inf,ext_sup,n):=
block(
[a,b,c,p,prec:10^(-9)],
a:ext_inf,
b:ext_sup,
local(f),
define(f(x),subst(x,var,expr)),
pasos:n,
if f(a)*f(b)>0 then error("Error: no hay cambio de signo"),
if abs(f(a)) < prec then return(a),
if abs(f(b)) < prec then return(b),
for i:1 thru pasos do
(j:i,
c:(f(b)*a-f(a)*b)/(f(b)-f(a)),
if abs(f(c))< prec then return ([j,c]),
if f(a)*f(c)< 0 then b:c else a:c
),
[j,c])$
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Presentamos la función a la que le vamos a calcular el cero;
es decir, a la que le vamos a aplicar el método de la
regula falsi:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
remfunction(f);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
f(x):=x^3-11;
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Dibujamos la gráfica para ver en qué intervalo aplicar el método:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
plot2d([f(x)], [x,-4,4])$
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Lo aplicamos en [0,4] y con 50 pasos:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
regulafalsi(f(x),x,0,4,50);
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Como podemos ver, con 37 pasos llega a calcular la solución segun la precisión introducida.
[wxMaxima: comment end ] */
/* [wxMaxima: comment start ]
Calculamos directamente la solución real de x^3=11
para comparar el resultado obtenido con el
método anterior:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
float(11^(1/3));
/* [wxMaxima: input end ] */
/* [wxMaxima: section start ]
Ejercicio3: Ejercicio 5.9 del tema 5 de prácticas.
[wxMaxima: section end ] */
/* [wxMaxima: comment start ]
Tenemos que calcular la solución de la siguiente ecuación por iteración funcional.
La función es: g(x)=x^2-5*x+2. Si despejamos x de esta función para llegar al tipo
de ecuaciones f(x)=x para aplicar este método; la ecuación se despeja de tres formas:
(1) x=(x^2+2)/5; por tanto llamamos f(x)=(x^2+2)/5;
(2) x=x^2-4*x+2; por tanto llamamos h(x)=x^2-4*x+2;
(3) x=sqrt(5*x-2); por tanto llamamos t(x)=sqrt(5*x-2).
Ahora aplicaremos el método de iteración funcional a cada una de estas funciones
en los puntos exigidos: 0.5 , 1 y 6.
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
remfunction(f,g,h);
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
En primer lugar, vamos a calcular las soluciones de
la ecuación inicialmente planteada:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
define(g(x), x*x-5*x+2);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
plot2d([g(x)], [x,-1,6],
[plot_format, gnuplot])$
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Como se trata de una ecuación de segundo grado,
le aplicamos el comando solve para ver cuáles serían sus
soluciones:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
solve(g(x)=0,x);
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Cargamos el método de iteración funcional para
encontrar un punto fijo de una función:
[wxMaxima: comment end ] */
/* [wxMaxima: input start ] */
iter(expr,var,inicio,pasos):=block(
[x0,x1],
x0:inicio,
local(f),
define(f(x),subst(x,var,expr)),
for i:1 thru pasos do(
x1:f(x0),
x0:x1),
x1
)$
/* [wxMaxima: input end ] */
/* [wxMaxima: subsect start ]
Le aplicamos el método de iteración funcional a la función f(x)
en cada uno de los tres puntos que nos proponen:
[wxMaxima: subsect end ] */
/* [wxMaxima: input start ] */
define(f(x),(x^2+2)/5);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
iter(f(x),x,0.5,10);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
iter(f(x),x,1.5,10);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
iter(f(x),x,6,10);
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Como podemos ver al aplicar el método a la función f(x), con 0.5 y 1
converge a una de las soluciones, mientras que comenzando en 6,
el método diverge.
[wxMaxima: comment end ] */
/* [wxMaxima: subsect start ]
Le aplicamos el método de iteración funcional a la función h(x)
en cada uno de los tres puntos que nos proponen:
[wxMaxima: subsect end ] */
/* [wxMaxima: input start ] */
define(h(x),x*x-4*x+2);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
iter(h(x),x,0.5,10);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
iter(h(x),x,1.5,10);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
iter(h(x),x,6,10);
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Como podemos ver al aplicar el método a la función h(x), en los
tres puntos de aplicación la sucesión tiende a infinito; es decir,
el método diverge comenzando en cualquier caso.
[wxMaxima: comment end ] */
/* [wxMaxima: subsect start ]
Le aplicamos el método de iteración funcional a la función t(x)
en cada uno de los tres puntos que nos proponen:
[wxMaxima: subsect end ] */
/* [wxMaxima: input start ] */
define(t(x),sqrt(5*x-2));
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
iter(t(x),x,0.5,10);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
iter(t(x),x,1.5,10);
/* [wxMaxima: input end ] */
/* [wxMaxima: input start ] */
iter(t(x),x,6,10);
/* [wxMaxima: input end ] */
/* [wxMaxima: comment start ]
Como podemos ver al aplicar el método a la función t(x) en los tres puntos
converge a una de las soluciones.
[wxMaxima: comment end ] */
/* Old versions of Maxima abort on loading files that end in a comment. */
"Created with wxMaxima 22.04.0"$
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment