funkcja nad listą mathematica

Oct 26 2020

Pracuję nad problemem, który wymaga zdefiniowania funkcji z dwoma listami danych w następujący sposób

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” jest listą dolnej granicy całkowania, a b jest górną granicą. Prawdziwy wynik mojej funkcji „angdis” to {100707., 71762., 25625.6, 13508.}. Dla mnie powinienem wstawić pierwszą listę „a” do mojej funkcji, a na końcu programu wstawić listę „b”, tak jak to zrobiłem, wynik jest inny z {100707., 71762., 25625.6, 13508.}.

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

angdist3[#, 0.3] & /@ a


oto wynik:

{{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.}}

Chcę na końcu zdefiniować funkcję, taką jak angdist3 [x_, om_], i podać mi: {100707., 71762., 25625.6, 13508.}, ale podaj złą listę.

Wszelkie sugestie będą mile widziane.

Odpowiedzi

4 SimonWoods Oct 26 2020 at 05:16

Jeśli chcesz obliczyć wszystkie 16 (4 × 4) całek, a następnie wyodrębnić elementy przekątne, użyj Diagonal:

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

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

Zamiast tego można obliczyć tylko te 4 wyniki. MapThreadodwzoruje oba ai bjednocześnie:

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

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

Alternatywnie można podać angdistten Listableatrybut, i po prostu przejść ai bjako argumenty:

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

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