for 루프에서 변수 만들기
Aug 19 2020
저는 mathematica를 처음 접했지만 변수를 생성하기 위해 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)]]
이것은 분명히 작동하지 않지만 이와 같은 것을 할 수 있습니까?
답변
4 infinitezero Aug 18 2020 at 23:25
이것을 재귀 적으로 정의하는 것은 어떻습니까?
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
5 BobHanlon Aug 18 2020 at 23:48
Clear["Global`*"]
재귀를 사용 RSolve하기 위해 infinitezero에 의한 제안을 계속 하여 일반 표현식을 찾는 데 사용 합니다.
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 *)
2 chuy Aug 19 2020 at 00:03
한 가지 더 방법은 다음과 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} *)