Criar variáveis ​​em um loop for

Aug 19 2020

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

4 infinitezero Aug 18 2020 at 23:25

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
5 BobHanlon Aug 18 2020 at 23:48
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 *)
2 chuy Aug 19 2020 at 00:03

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} *)