목록 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둘 이상의 매핑됩니다 a와 b동시에 :
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.}