forループで変数を作成する

Aug 19 2020

私は数学に非常に慣れていませんが、変数を作成するために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!;

2行目の二重代入は非常に重要です。これにより、すべての関数呼び出しが1回だけ評価されます。最初に評価されると、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

もう1つの方法は、次を使用し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} *)