Bir for döngüsünde değişkenler oluşturun

Aug 19 2020

Mathematica'da çok yeniyim, ancak değişkenler oluşturmak için For döngülerini kullanmak benim için çok daha kolay olurdu. Düşünce trenim basitti, ama görünüşe göre işe yaramıyor. Diyelim ki bu değişkenleri tanımladım

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!

Sayısal yöntemler sınıfımdaki bir sonraki adım, mutlak hatayı elde etmekti, bu da örneğin gerçek değeri "ex1" den alacağım deneysel değerden çıkarmak anlamına geliyor. Bu arada, burada yaklaşık olarak tahmin etmeye çalıştığımız şey e ^ 0.5.

Yani ilk yaptığım şey şuydu:

ae1 = (e^0.5 - ex1)

Ve hepsi için o adımı tekrarladım. Bunları değişkenleri tanımladığım ve döngüdeki geçmiş değişkenleri kullandığım bir For döngüsüne dahil etmek istiyorum. Düşünce trenim şuydu:

For[i = 1, i < 7, i++, Print[aei = (e^0.5 - exi)]]

Bu açıkçası işe yaramıyor, ancak böyle bir şey yapmak mümkün mü?

Yanıtlar

4 infinitezero Aug 18 2020 at 23:25

Bunu yinelemeli olarak tanımlamaya ne dersiniz?

ex[0] = 1;
ex[n_] := ex[n] = ex[n - 1] + 0.5^n/n!;

İkinci satırdaki ikili atama çok önemlidir. Bu, tüm işlev çağrılarının yalnızca bir kez değerlendirilmesine neden olur. Başlangıçta değerlendirildikten sonra, ex [n] olarak kaydedilecektir.

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

Özyinelemeyi kullanmak RSolveiçin infinitezero'nun önerisine devam ederek , genel ifadeyi bulmak için kullanın .

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

İlk birkaç değer

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}

Yaklaşık olan

% // 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 *)

Bu dizinin sınırı

Limit[ex[n], n -> Infinity]

(* Sqrt[E] *)

% // N[%, 20] &

(* 1.6487212707001281468 *)
2 chuy Aug 19 2020 at 00:03

Kullanmanın bir yolu daha 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} *)