Criar variáveis em um loop for
Sou muito novo no mathematica, mas seria muito mais fácil para mim usar loops For para criar variáveis. Minha linha de pensamento era simples, mas aparentemente não funciona. Digamos que eu defini essas variáveis
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!
O próximo passo na minha aula de métodos numéricos foi obter o erro absoluto, o que significa subtrair o valor real do valor experimental que obteria de "ex1", por exemplo. A propósito, o que estamos tentando aproximar aqui é e^0,5.
Então o que eu fiz primeiro foi:
ae1 = (e^0.5 - ex1)
E apenas repetiu esse passo para todos eles. Eu gostaria de apresentá-los em um loop For, no entanto, onde estou definindo variáveis e usando variáveis anteriores no loop. Minha linha de pensamento foi:
For[i = 1, i < 7, i++, Print[aei = (e^0.5 - exi)]]
Isso obviamente não funciona, mas é possível fazer algo assim?
Respostas
Que tal definir isso recursivamente?
ex[0] = 1;
ex[n_] := ex[n] = ex[n - 1] + 0.5^n/n!;
A atribuição dupla na segunda linha é muito importante. Isso faz com que todas as chamadas de função sejam avaliadas apenas uma vez. Uma vez avaliado inicialmente, será salvo em 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`*"]
Continuando com a sugestão de infinitezero de usar recursão, use RSolvepara encontrar a expressão geral.
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] *)
Os primeiros vários valores são
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 são 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 *)
O limite desta sequência é
Limit[ex[n], n -> Infinity]
(* Sqrt[E] *)
% // N[%, 20] &
(* 1.6487212707001281468 *)
Mais uma maneira, 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} *)