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$알고리즘에서 지정되지 않은 상태로 유지됩니다. 이제 반복자 목록 (예 :)을 수동으로 만들고 Tuples적용 Sum하여이를 구현하는 방법을 알고 있습니다. 그러나 나에게는 우아한 코드 라기보다는 해킹처럼 느껴진다.

나는 항상 코드를 최대한 우아하게 만들려고 노력하기 때문에 이것을 배울 수있는 좋은 기회라고 생각합니다. 항상 이해하기 어려웠지만 마스터하고 싶은 개념 중 하나는 NestFold. 이 합계는 자체 중첩 함수로 볼 수 있습니다.$$ 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. 내가 정의 할 필요가 피하려고 경우에도 이보다 도착 fF:

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가 expr에 n 번 적용된 표현식을 제공합니다."

Nest 함수, 표현식, n의 양의 정수를받습니다.

그 이상도 이하도 아닌.

Nest 어떻게 든 구식입니다.

으로 대체됩니다 Composition.

Compositionwith 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가 다소 다르다는 것을 분명히합니다.

SumPlus위의 방식으로 파생됩니다 . 의 문서 페이지 Plus에 몇 가지 대안을 보여줍니다 Sum.

복잡한 제품을 구축하기 위해 Mathematica는 Product. Nest문서 페이지에 와 줄 이 Product없으며 그 반대도 마찬가지입니다.

이것이 귀하의 질문에 대해 무엇을 의미합니까? 이제 처음에는 아무것도 없습니다. 그러나 이것은 강력한 힌트입니다.

반면 NestN과 반복을하고, 세 번째 인수 위치에서 "시간"상수, ProductX "하지만 시작과 끝 반복자 내가 필요하지 않습니다. 즉, 귀하의 피가수 대표하는 것입니다. 나는에 대한 설명서 페이지의 예제를 받아 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은 다음 예와 같이 닫힌 공식을 가져 오는 데 더 중요합니다.

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 @*.

이것은 scan vs map vs apply 에 대한 높은 등급의 답변 입니다. 이 답변은 Composition과 Apply의 몇 가지 차이점을 설명합니다 . 이 답변은 관련 주제에서 훨씬 더 깊이 들어갑니다. 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.

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

약이 질문에 둥지 배-IS-이-AN-확장을위한-개보다 2 인자가 장을 말한다 두 개의 인수에 접어 에드 기능의 5.5.3 제한되는 의사 레오 니드 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}

이것들은 매우 특별하지만 트릭을 만들고 확장 기능이 이미 포함되어 있습니다.

이제 마지막으로이 개요 문서를 참조하겠습니다.

절차 적 루프에 대한 대안과 수학의 반복 목록

여기에는 Fold 및 Nest를 사용하는 몇 가지 예가 포함되어 있으며 다른 상황에서이를 대체 내장 기능과 비교합니다. 이것은 모두 매우 훌륭하며 무엇을 Nest하고 무엇을 할 수 있고 무엇을하지 않는지에 대한 더 깊은 지식을 제공합니다 . 내장 Nest을 다른 내장 및 조합과 비교합니다 Composition.

Iterator에 대한 Mathematica 문서를 검색하여 입력 값 n에 대한 더 나은 정의와 이에 대한 Mathematica 패러다임 선택에 대한 설명을 얻으십시오.

Mathematica 문서에는 셀과 Wolfram 언어 인터프리터에 대한 두 가지 정의가 있습니다. 따라서 WolframAlpha의 유용성을위한 입력에 대한 검색 가이드는

에서 보라 고정 소수점 내장 된 역사적 둥지로 그룹화하고 제한 내장 둥지의 무한 반복을 위해, 응용 프로그램과 같은 매스 매 티카 사용자의 세대. 유명한 튜토리얼은 함수를 반복적으로 적용하는 것입니다.

Wolfram 언어를 기반으로 Mathematica가 대응할 수있는 인덱스 범위를 정의합니다.

이것이 Nest와 모두가 부족하고 Prodcut이 가진 것입니다.