Crear variables en un bucle for

Aug 19 2020

Soy muy nuevo en Mathematica, pero sería mucho más fácil para mí usar bucles For para crear variables. Mi línea de pensamiento fue simple, pero aparentemente no funciona. Digamos que definí estas variables

ex1 = 1 + 0.5
ex2 = ex1 + 0.5^2/2!
ex3 = ex2 + 0.5^3/3!
ex4 = ex3 + 0.5^4/4!
ex5 = ex4 + 0.5^5/5!
ex6 = ex5 + 0.5^6/6!

El siguiente paso en mi clase de métodos numéricos fue obtener el error absoluto, lo que significa restar el valor real del valor experimental que obtendría de "ex1", por ejemplo. Lo que estamos tratando de aproximar aquí es e^0.5, por cierto.

Así que lo que hice primero fue:

ae1 = (e^0.5 - ex1)

Y acaba de repetir ese paso para todos ellos. Sin embargo, me gustaría introducirlos en un bucle For, donde estoy definiendo variables y usando variables pasadas en el bucle. Mi línea de pensamiento fue:

For[i = 1, i < 7, i++, Print[aei = (e^0.5 - exi)]]

Esto obviamente no funciona, pero ¿es posible hacer algo como esto?

Respuestas

4 infinitezero Aug 18 2020 at 23:25

¿Qué hay de definir esto recursivamente?

ex[0] = 1;
ex[n_] := ex[n] = ex[n - 1] + 0.5^n/n!;

La doble asignación en la segunda línea es muy importante. Esto hace que todas las llamadas a funciones se evalúen solo una vez. Una vez evaluado inicialmente, se guardará en ex[n].

Table[{k, ex[k]}, {k, 1, 10}] // TableForm
1 1.5
2 1.625
3 1.64583
4 1.64844
5 1.6487
6 1.64872
7 1.64872
8 1.64872
9 1.64872
10 1.64872
5 BobHanlon Aug 18 2020 at 23:48
Clear["Global`*"]

Continuando con la sugerencia de infinitezero de usar recursividad, use RSolvepara encontrar la expresión general.

ex[n_] = ex[n] /. 
  RSolve[{ex[0] == 1, ex[n] == ex[n - 1] + (1/2)^n/n!}, ex[n], n][[1]]

(* (Sqrt[E] Gamma[1 + n, 1/2])/Gamma[1 + n] *)

Los primeros valores son

ex /@ Range[0, 10] *)

(* {1, 3/2, 13/8, 79/48, 211/128, 6331/3840, 75973/46080, 354541/215040, \
17017969/10321920, 306323443/185794560, 2042156287/1238630400}

que son aproximadamente,

% // N

(* {1., 1.5, 1.625, 1.64583, 1.64844, 1.6487, 1.64872, 1.64872, 1.64872, \
1.64872, 1.64872} *)

%[[-1]] // InputForm

(* 1.6487212706873657 *)

El límite de esta sucesión es

Limit[ex[n], n -> Infinity]

(* Sqrt[E] *)

% // N[%, 20] &

(* 1.6487212707001281468 *)
2 chuy Aug 19 2020 at 00:03

Una forma más, usando FoldList:

FoldList[#1 + 0.5^#2/#2! &, 1 , Range[7]]
(* {1, 1.5, 1.625, 1.64583, 1.64844, 1.6487, 1.64872, 1.64872} *)