สร้างตัวแปรในการวนซ้ำ

Aug 19 2020

ฉันยังใหม่กับ mathematica มาก แต่มันจะง่ายกว่ามากสำหรับฉันที่จะใช้สำหรับลูปเพื่อสร้างตัวแปร ความคิดของฉันเรียบง่าย แต่ไม่ได้ผล สมมติว่าฉันกำหนดตัวแปรเหล่านี้

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 loop ซึ่งฉันกำลังกำหนดตัวแปรและใช้ตัวแปรที่ผ่านมาในลูป ความคิดของฉันคือ:

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`*"]

ดำเนินการต่อด้วยคำแนะนำโดย infinitezero เพื่อใช้การเรียกซ้ำให้ใช้RSolveเพื่อค้นหานิพจน์ทั่วไป

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