ผลรวมที่ถูกล่ามโซ่กับ Nest
ฉันต้องการคำนวณผลรวมที่ถูกล่ามโซ่เช่นนี้ $$ 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
หรือโครงสร้างการทำงานอื่น?
คำตอบ
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}]}]
"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
กับบิวท์อินอื่น ๆ และชุดค่าผสมและComposition
s
ค้นหาเอกสาร Mathematica สำหรับ Iterator เพื่อให้ได้สิ่งนี้เป็นคำจำกัดความที่ดีกว่าสำหรับค่าอินพุต n และคำอธิบายบางประการสำหรับการเลือกกระบวนทัศน์ Mathematica เกี่ยวกับเรื่องนั้น
มีคำจำกัดความสองคำสำหรับ Expression ในเอกสาร Mathematica หนึ่งสำหรับเซลล์และอีกคำหนึ่งสำหรับตัวแปลภาษา Wolfram ดังนั้นคำแนะนำในการค้นหาดังกล่าวในอินพุตที่ทุ่มเทเพื่อประโยชน์ของ WolframAlpha
ดูที่FixedPoint ซึ่งเป็นกลุ่มที่มีอยู่แล้วภายในซึ่งจัดกลุ่มกับ Nest และสำหรับผู้ใช้ Mathematica รุ่นใหม่เนื่องจากเป็นข้อ จำกัด ในตัวของ Nest สำหรับการทำซ้ำที่ไม่สิ้นสุด บทช่วยสอนที่มีชื่อเสียงคือการใช้ฟังก์ชันซ้ำ ๆ

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