ผลรวมที่ถูกล่ามโซ่กับ Nest

Aug 20 2020

ฉันต้องการคำนวณผลรวมที่ถูกล่ามโซ่เช่นนี้ $$ C_m = \sum\limits_{i_1=1}^N \;\sum\limits_{i_2=i_1+1}^N \;\sum\limits_{i_3=i_2+1}^N \cdots \;\sum\limits_{i_m=i_{m-1}+1}^N A_{i_1}A_{i_2}A_{i_3}\cdots A_{i_m} $$ ตัวอย่างเช่นเมื่อ $m=3$นี่จะกลายเป็น $$ C_3 = \sum\limits_{i=1}^N \;\sum\limits_{j=i+1}^N \;\sum\limits_{k=j+1}^N A_i A_j A_k $$ แน่นอนว่าประเด็นคือฉันต้องการ $m$ยังคงไม่ได้ระบุไว้ในอัลกอริทึม ตอนนี้ฉันรู้วิธีการดำเนินการนี้โดยการทำรายการด้วยตนเอง iterator (เช่นมีTuples) และการประยุกต์ใช้Sumกับมัน แต่สำหรับฉันแล้วรู้สึกเหมือนแฮ็คมากกว่าโค้ดที่สวยงาม

ขณะที่ผมพยายามที่จะได้รับรหัสของฉันเป็นสง่างามที่เป็นไปได้ผมเห็นว่านี่เป็นโอกาสดีที่จะ learn.One ของแนวคิดที่ฉันมักจะมียากที่จะเข้าใจ ( แต่ชอบที่จะต้นแบบ) คือการใช้และNest Foldผลรวมนี้สามารถมองได้ว่าเป็นฟังก์ชันที่ซ้อนอยู่ในตัวมันเอง$$ C_m = \sum\limits_{i_1=1}^N A_{i_1} \left[ \;\sum\limits_{i_2=i_1+1}^N A_{i_2} \left[ \;\sum\limits_{i_3=i_2+1}^N A_{i_3} \left[ \cdots\vphantom{\sum\limits_{i_3=i_2+1}^N} \right]\right]\right] $$ฉันคาดหวังว่าNestจะเป็นผู้สมัครในอุดมคติ ฉันพยายามมาบ้างแล้ว แต่สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือ

f[g_,j_] := Sum[g[k]A[k], {k,j+1,n}]
F[x_] := f[x,#]&

c[m_] := f[Nest[F,1&,m-1],0]

ฉันพบนี้น่าเกลียดโดยเฉพาะอย่างยิ่งโดยเฉพาะอย่างยิ่งทั้งสองคำจำกัดความของฟังก์ชั่นที่ยังคงต้องมีฟังก์ชั่นภายในบริสุทธิ์Fเช่นเดียวกับความจริงที่ว่าฉันจะต้องตัดเพิ่มอีกรอบf Nestมันจะน่าเกลียดกว่านี้ถ้าฉันพยายามหลีกเลี่ยงความจำเป็นในการกำหนดfและF:

c[m_] := Sum[
  Nest[ Function[var,Sum[var[k]A[k],{k,#+1,5}]&], 1&, m-1][l] A[l]
, {l,1,n}]

ด้วยความจำเป็นในการใช้งานFunctionและ&.

นี่คือคำถามของฉัน: มีวิธีที่ดีกว่าในการบรรลุผลรวมที่ถูกล่ามโซ่นี้Nestหรือไม่? ถ้าไม่อาจใช้Foldหรือโครงสร้างการทำงานอื่น?

คำตอบ

3 march Aug 20 2020 at 21:21

Tableทำสิ่งนี้โดยอัตโนมัติ คุณควรจะปรับรหัสต่อไปนี้ได้:

f[m_, n_] := Sum[
   Product[A[i[j]], {j, 1, m}] // Evaluate, 
   Sequence @@ Prepend[Table[{i[j], i[j - 1] + 1, n}, {j, 2, m}], {i[1], 1, n}] // Evaluate
  ]

ด้วยประการฉะนี้

f[2, 3]
(* A[1] A[2] + A[1] A[3] + A[2] A[3] *)

และ

f[3, 5]
(* A[1] A[2] A[3] + A[1] A[2] A[4] + A[1] A[3] A[4] + A[2] A[3] A[4] + A[1] A[2] A[5] + A[1] A[3] A[5] + A[2] A[3] A[5] + A[1] A[4] A[5] + A[2] A[4] A[5] + A[3] A[4] A[5] *)

อีกวิธีหนึ่งคือสร้างดัชนีโดยตรงและใช้ฟังก์ชันกับดัชนีดังต่อไปนี้:

f2[n_, m_] := Times @@@ Map[A, Subsets[Range[m], {n}], {2}] // Total
f2[3, 5]
(* A[1] A[2] A[3] + A[1] A[2] A[4] + A[1] A[3] A[4] + A[2] A[3] A[4] + A[1] A[2] A[5] + A[1] A[3] A[5] + A[2] A[3] A[5] + A[1] A[4] A[5] + A[2] A[4] A[5] + A[3] A[4] A[5] *)

และ

f[3, 5] - f2[3, 5]
(* 0 *)

หรือ

f3[n_, m_] := Sum[Times @@ A /@ is, {is, Subsets[Range[m], {n}]}]
SteffenJaeschke Aug 22 2020 at 18:48

"Nest [f, expr, n] ให้นิพจน์ที่ใช้ f n คูณกับ expr"

Nest รับฟังก์ชันนิพจน์ n ของจำนวนเต็มบวก

ไม่มากไม่น้อย.

Nest ล้าสมัยไปแล้ว

มันถูกแทนที่โดยComposition

Compositionเป็นคำศัพท์พื้นฐานทางคณิตศาสตร์ที่มาจาก with Nestคือมา

มีตัวอย่างในเอกสารขององค์ประกอบสำหรับผลรวม:

Composition[HoldForm, Plus] @@ Range[20]
___
\!\(
TagBox[
RowBox[{"1", "+", "2", "+", "3", "+", "4", "+", "5", "+", "6", "+", 
    "7", "+", "8", "+", "9", "+", "10", "+", "11", "+", "12", "+", 
    "13", "+", "14", "+", "15", "+", "16", "+", "17", "+", "18", "+", 
    "19", "+", "20"}],
HoldForm]\)

สิ่งนี้ทำให้ชัดเจนว่า Sum และ Nest ค่อนข้างแตกต่างกัน

Sumได้มาจากPlusในลักษณะข้างต้น หน้าเอกสารของPlusจะแสดงทางเลือกอื่นSum

ในการสร้างผลิตภัณฑ์ที่ซับซ้อน Mathematica นำเสนอไฟล์Product. ไม่มีบรรทัดNestในหน้าเอกสารProductหรือในทางกลับกัน

นั่นหมายความว่าอย่างไรสำหรับคำถามของคุณ? ตอนนี้ตอนแรกไม่มีอะไร แต่มันเป็นคำใบ้ที่แข็งแกร่ง

ในขณะที่Nestเป็นซ้ำกับ n คงที่ "เวลา" ที่ตำแหน่งอาร์กิวเมนต์ที่สาม, Productไม่จำเป็นต้องมี x" แต่ iterator ฉันกับการเริ่มต้นและจุดสิ้นสุด. นั่นคือสิ่งที่ summands ของคุณแทน. ฉันยอมรับตัวอย่างในหน้าเอกสารสำหรับProductที่อยู่ห่างไกลที่จะ ง่ายหรือเชี่ยวชาญมาก

มีตัวอย่างและวิธีการที่ดีวิธีทำให้มีประสิทธิภาพมากขึ้น:

∑𝑖=2𝑁cos𝜃𝑖cos𝜃′𝑖∏𝑗=𝑖+1𝑀sin𝜃𝑗𝜃′𝑗

    NSum[Cos[θ[[i]]] Cos[Θp[[i]]] Product[    Sin[θ[[j]]] Sin[θp[[j]]], {j, i + 1, d - 1}], {i, 2,    d - 1}]


f[M_, n_] := Reverse[Table[Cos[θ[i]] Cos[θ'[i]], {i, 2, n}]].PadLeft[FoldList[
Sin[θ[M - #2] θ'[M - #2]] # &, Sin[θ[M] θ'[M]], Range[M - 3]], Max[n - 1, 0], 1]

คำถามนี้เป็นห่วงแล้วเกี่ยวกับผลรวมหรือผลิตภัณฑ์ที่มีการยกเว้น

Sum มีความสำคัญมากกว่าสำหรับการรับ formulars แบบปิดเช่นในตัวอย่างนี้:

Sum[Product[i^2, {i, 1, n}], {i, 1, n}]
n (n!)^2

n = 4;
Times @@ Flatten@Table[f[a[i] - a[j]], {i, 1, n - 1}, {j, i + 1, n}]

หรือ

With[{n = 6}, Times @@ f /@ Subtract @@@ Subsets[Array[a, n], {2}]]

สามารถทำได้ด้วยตัววนซ้ำหรือรายการ ตัววนซ้ำจำเป็นต้องกำหนดรายการค่าสัมประสิทธิ์ไว้แล้วและทำซ้ำในรูปแบบเชิงเส้น ในเวอร์ชัน Mathematica ที่ทันสมัยกว่าเวอร์ชันที่สองจะเร็วกว่าในบริบทส่วนใหญ่

ทำให้สูตรใช้ของผู้ประกอบการที่แตกต่างกัน@, @@และที่มีความแตกต่างกันไป@@@Composition @*

นี่คือคำตอบของการจัดอันดับสูงเกี่ยวกับการสแกนเทียบกับแผนที่ VS ใช้ คำตอบนี้จะอธิบายถึงความแตกต่างบางอย่างระหว่างองค์ประกอบและนำไปใช้ คำตอบนี้เจาะลึกลงไปมากในหัวข้อที่เกี่ยวข้อง: ตัวดำเนินการ v10s เป็นแบบฟอร์มว่าอะไรดี?

คำตอบนี้มีความเข้าใจผิดทั่วไปบางประการ: ฉันจะกำหนดอาร์กิวเมนต์ในแผนที่ที่ซ้อนกันได้อย่างไร

ClearAll[list1, list2, a, b, c, x, y, z, f]
list1 = {a, b, c}
list2 = {x, y, z}
___
Map[Map[f[#1, #2] &, list1] &, list2]
__
list2
___
Map[Function[x, Map[f[#1, x] &, list1]], list2]
___
list2

แต่ผลลัพธ์ที่ต้องการคือสิ่งนี้

Outer[f, list1, list2]
(*
  {{f[a, x], f[a, y], f[a, z]}, 
   {f[b, x], f[b, y], f[b, z]}, 
   {f[c, x], f[c, y], f[c, z]}}
*)

Map[Function[p2, Map[Function[p1, f[p1, p2]], list1]], list2]

(* {{f [a, x], f [b, x], f [c, x]}, {f [a, y], f [b, y], f [c, y]}, { f [a, z], f [b, z], f [c, z]}} *)

หาก f ไม่อยู่ในรายชื่อสิ่งนี้สามารถเขียนได้ด้วยวิธีนี้:

Distribute[f[{a, b, c}, {x, y, z}], List]
(*
  {{f[a, x], f[b, x], f[c, x]}, 
   {f[a, y], f[b, y], f[c, y]}, 
   {f[a, z], f[b, z], f[c, z]}}
*)

ทางเลือกต่อไปคือ

ทูเปิล [{{a, b, c}, {x, y, z}}] ( {{a, x}, {a, y}, {a, z}, {b, x}, {b, y }, {b, z}, {c, x}, {c, y}, {c, z}} )

Apply[f, Tuples[{{a, b, c}, {x, y, z}}], {1}]

( {f [a, x], f [a, y], f [a, z], f [b, x], f [b, y], f [b, z], f [c, x] , f [c, y], f [c, z]} )

และในทางกลับกันสิ่งนี้ช่วยให้สิ่งที่ต้องการNest:

รัง [f, #, 1] & / @ ทูเปิลส์ [{{a, b, c}, {x, y, z}}] ( {f [{a, x}], f [{a, y}] , f [{a, z}], f [{b, x}], f [{b, y}], f [{b, z}], f [{c, x}], f [{c , y}], f [{c, z}]} )

คำถามเกี่ยวกับnest-fold-is-there-an-extension-for-more-than-2-arguments นี้อ้างถึงบทที่5.5.3 ข้อ จำกัด ของฟังก์ชัน Fold-ed ต่ออาร์กิวเมนต์สองอาร์กิวเมนต์เป็นการปลอมแปลงหนังสือออนไลน์โดย Leonid Shifrin และ ตัวอย่างที่มีสามช่อง:

multiFoldList[f_, start_, args__List] := 
 FoldList[f @@ Prepend[#2, #] &, start, {args}\[Transpose]] 
____
multiFoldList[#1 (1 + #2) - #3 &, 1000, {.01, .02, .03}, {100, 200, 
  300}]
___
{1000, 910., 728.2, 450.046}

สิ่งเหล่านี้พิเศษมาก แต่สิ่งเหล่านี้ทำให้เคล็ดลับและมีการรวมส่วนขยายไว้แล้ว

สำหรับตอนนี้ฉันต้องการอ้างถึงบทความภาพรวมนี้

ทางเลือกไปยังขั้นตอนการวนซ้ำและการวนซ้ำในรายการใน mathematica /

ซึ่งรวมถึงตัวอย่างบางส่วนโดยใช้ Fold และ Nest และเปรียบเทียบสิ่งนี้ในสถานการณ์ต่างๆกับบิวท์อินทางเลือก ทั้งหมดนี้เป็นสิ่งที่ดีและให้ความรู้ที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับสิ่งที่Nestทำได้และทำได้และไม่ได้อะไร ฉันเปรียบเทียบบิวท์อินNestกับบิวท์อินอื่น ๆ และชุดค่าผสมและCompositions

ค้นหาเอกสาร Mathematica สำหรับ Iterator เพื่อให้ได้สิ่งนี้เป็นคำจำกัดความที่ดีกว่าสำหรับค่าอินพุต n และคำอธิบายบางประการสำหรับการเลือกกระบวนทัศน์ Mathematica เกี่ยวกับเรื่องนั้น

มีคำจำกัดความสองคำสำหรับ Expression ในเอกสาร Mathematica หนึ่งสำหรับเซลล์และอีกคำหนึ่งสำหรับตัวแปลภาษา Wolfram ดังนั้นคำแนะนำในการค้นหาดังกล่าวในอินพุตที่ทุ่มเทเพื่อประโยชน์ของ WolframAlpha

ดูที่FixedPoint ซึ่งเป็นกลุ่มที่มีอยู่แล้วภายในซึ่งจัดกลุ่มกับ Nest และสำหรับผู้ใช้ Mathematica รุ่นใหม่เนื่องจากเป็นข้อ จำกัด ในตัวของ Nest สำหรับการทำซ้ำที่ไม่สิ้นสุด บทช่วยสอนที่มีชื่อเสียงคือการใช้ฟังก์ชันซ้ำ ๆ

กำหนดช่วงสำหรับดัชนีที่ Mathematica สามารถรับมือกับภาษา Wolfram ได้

นั่นคือสิ่งที่ Nest และเหมือนกันขาดและ Prodcut มี