Buat variabel dalam perulangan for

Aug 19 2020

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

4 infinitezero Aug 18 2020 at 23:25

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
5 BobHanlon Aug 18 2020 at 23:48
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 *)
2 chuy Aug 19 2020 at 00:03

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