Создание переменных в цикле for
Я новичок в математике, но мне было бы намного проще использовать циклы For для создания переменных. Ход моих мыслей был прост, но, по всей видимости, не работает. Допустим, я определил эти переменные
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!
Следующим шагом в моем классе численных методов было получение абсолютной ошибки, что означает вычитание реального значения из экспериментального значения, которое я бы получил, например, из «ex1». Между прочим, мы пытаемся аппроксимировать здесь e ^ 0,5.
Итак, что я сделал первым, было:
ae1 = (e^0.5 - ex1)
И просто повторил этот шаг для всех. Однако я хотел бы ввести их в цикл For, где я определяю переменные и использую прошлые переменные в цикле. Ход моих мыслей был таким:
For[i = 1, i < 7, i++, Print[aei = (e^0.5 - exi)]]
Это явно не работает, но можно ли сделать что-то подобное?
Ответы
А как насчет рекурсивного определения этого?
ex[0] = 1;
ex[n_] := ex[n] = ex[n - 1] + 0.5^n/n!;
Двойное присвоение во второй строке очень важно. Это приводит к тому, что все вызовы функций оцениваются только один раз. После первоначальной оценки он будет сохранен в 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`*"]
Продолжая с предложением infinitezero использовать рекурсию, используйте, RSolveчтобы найти общее выражение.
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] *)
Первые несколько значений:
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}
Что примерно,
% // 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 *)
Предел этой последовательности равен
Limit[ex[n], n -> Infinity]
(* Sqrt[E] *)
% // N[%, 20] &
(* 1.6487212707001281468 *)
Еще один способ, используя 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} *)