Buat variabel dalam perulangan for
Saya sangat baru mengenal mathematica, tetapi akan jauh lebih mudah bagi saya untuk menggunakan loop For untuk membuat variabel. Alur pikiran saya sederhana, tetapi tampaknya tidak berhasil. Katakanlah saya mendefinisikan variabel-variabel ini
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!
Langkah selanjutnya di kelas metode numerik saya adalah mendapatkan kesalahan absolut, yang berarti mengurangkan nilai riil dari nilai eksperimen yang akan saya dapatkan dari "ex1", misalnya. Apa yang kita coba perkirakan di sini adalah e ^ 0,5.
Jadi yang pertama saya lakukan adalah:
ae1 = (e^0.5 - ex1)
Dan hanya mengulangi langkah itu untuk mereka semua. Saya ingin memperkenalkan ini ke loop For, di mana saya mendefinisikan variabel dan menggunakan variabel lampau dalam loop. Kereta pikiran saya adalah:
For[i = 1, i < 7, i++, Print[aei = (e^0.5 - exi)]]
Ini jelas tidak berhasil, tetapi mungkinkah melakukan sesuatu seperti ini?
Jawaban
Bagaimana dengan mendefinisikan ini secara rekursif?
ex[0] = 1;
ex[n_] := ex[n] = ex[n - 1] + 0.5^n/n!;
Tugas ganda di baris kedua sangat penting. Ini menyebabkan semua panggilan fungsi dievaluasi hanya sekali. Setelah awalnya dievaluasi, itu akan disimpan di 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`*"]
Melanjutkan dengan saran oleh infinitezero untuk menggunakan rekursi, gunakan RSolveuntuk menemukan ekspresi umum.
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] *)
Beberapa nilai pertama adalah
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}
Yang kira-kira,
% // 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 *)
Batas urutan ini adalah
Limit[ex[n], n -> Infinity]
(* Sqrt[E] *)
% // N[%, 20] &
(* 1.6487212707001281468 *)
Satu cara lagi, dengan menggunakan 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} *)