Créer des variables dans une boucle for
Je suis très nouveau dans mathematica, mais il serait beaucoup plus facile pour moi d'utiliser des boucles For afin de créer des variables. Mon train de pensée était simple, mais apparemment ne fonctionne pas. Disons que j'ai défini ces 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!
La prochaine étape de ma classe de méthodes numériques consistait à obtenir l'erreur absolue, ce qui signifie soustraire la valeur réelle de la valeur expérimentale que j'obtiendrais de "ex1", par exemple. Ce que nous essayons d'approximer ici est e ^ 0,5, soit dit en passant.
Donc ce que j'ai fait en premier c'est :
ae1 = (e^0.5 - ex1)
Et juste répété cette étape pour chacun d'eux. J'aimerais cependant les introduire dans une boucle For, où je définis des variables et utilise des variables passées dans la boucle. Mon train de pensée était:
For[i = 1, i < 7, i++, Print[aei = (e^0.5 - exi)]]
Cela ne fonctionne évidemment pas, mais est-il possible de faire quelque chose comme ça ?
Réponses
Qu'en est-il de la définition récursive ?
ex[0] = 1;
ex[n_] := ex[n] = ex[n - 1] + 0.5^n/n!;
La double affectation en deuxième ligne est très importante. Ainsi, tous les appels de fonction ne sont évalués qu'une seule fois. Une fois qu'il a été initialement évalué, il sera enregistré dans 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
Clear["Global`*"]
En continuant avec la suggestion d'infinityzero d'utiliser la récursivité, utilisez RSolvepour trouver l'expression générale.
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] *)
Les premières valeurs sont
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}
Qui sont environ,
% // 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 *)
La limite de cette suite est
Limit[ex[n], n -> Infinity]
(* Sqrt[E] *)
% // N[%, 20] &
(* 1.6487212707001281468 *)
Une autre façon, en utilisant 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} *)