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