목록 Mathematica에 대한 기능

Oct 26 2020

다음과 같이 두 개의 데이터 목록으로 함수를 정의해야하는 문제를 해결합니다.

a = {0.1, 0.233, 0.65, 1.56};
b = {0.99, 0.8, 0.9, 1.9};

ELCDM1[z_?NumericQ, om_?NumericQ] := 1/Sqrt[om*(1 + z)^3 + 1 - om];

angdist[zmin_?NumberQ, zmax_?NumberQ, om_?NumberQ] := (3*10^5)/(

   1 + zmax) NIntegrate[ELCDM1[z, om], {z, zmin, zmax}];

"a"는 적분의 하한 목록이고 b는 상한입니다. 내 함수 "angdis"의 실제 결과는 {100707., 71762., 25625.6, 13508.}입니다. 나를 위해 첫 번째 목록 "a"를 내 기능에 넣고 프로그램 끝에 "b"목록을 넣어야합니다. 따라서 다음과 같이 결과가 {100707., 71762., 25625.6, 13508.}과 다릅니다.

angdist3[x_, om_] := (3*10^5)/(1 + #) NIntegrate[ELCDM1[z, om], {z, x, #}] & /@b;

angdist3[#, 0.3] & /@ a


결과는 다음과 같습니다.

{{100707., 92199.9, 97142.2, 111441.}, {82220.6, 71762., 77779.9, 
  98755.}, {32424.9, 16710.2, 25625.6, 
  64584.9}, {-42008.8, -65580.4, -52333.9, 13508.}}

마지막에 angdist3 [x_, om_]과 같은 함수를 정의하고 {100707., 71762., 25625.6, 13508.}을 제공하고 싶지만 잘못된 목록을 제공합니다.

어떤 제안이라도 대단히 감사하겠습니다.

답변

4 SimonWoods Oct 26 2020 at 05:16

16 개 (4x4) 적분을 모두 계산 한 다음 대각선 요소를 추출해야하는 경우 다음을 사용하십시오 Diagonal.

Diagonal[angdist3[#, 0.3] & /@ a]

{100707., 71762., 25625.6, 13508.}

대신이 4 개의 결과 만 계산할 수 있습니다. MapThread둘 이상의 매핑됩니다 ab동시에 :

MapThread[angdist[#1, #2, 0.3] &, {a, b}]

{100707., 71762., 25625.6, 13508.}

또는 당신이 줄 수 속성을 간단하게 통과 및 인수로 :angdistListableab

SetAttributes[angdist, Listable]
angdist[a, b, 0.3]

{100707., 71762., 25625.6, 13508.}