matematik listesi üzerinde işlev
Aşağıdaki gibi iki veri listesi ile fonksiyonu tanımlamam gereken problem üzerinde çalışıyorum
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", integralin alt sınırının listesidir ve b, üst sınırdır. "Angdis" işlevim için gerçek sonuç {100707., 71762., 25625.6, 13508.}. Benim için fonksiyonuma ilk "a" listesini koymalıyım ve programımın sonuna "b" listesini koymalıyım, böylece aşağıdaki gibi sonuç {100707., 71762., 25625.6, 13508.} ile farklı olacaktır.
angdist3[x_, om_] := (3*10^5)/(1 + #) NIntegrate[ELCDM1[z, om], {z, x, #}] & /@b;
angdist3[#, 0.3] & /@ a
işte sonuç:
{{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.}}
Sonunda angdist3 [x_, om_] gibi bir işlevi tanımlamak ve bana şunu vermek istiyorum: {100707., 71762., 25625.6, 13508.} ama bana yanlış bir liste verin.
Herhangi bir öneri çok takdir edilecektir.
Yanıtlar
Tüm 16 (4 × 4) integralleri hesaplamanız ve ardından köşegen elemanları çıkarmanız gerekiyorsa, şunu kullanın Diagonal:
Diagonal[angdist3[#, 0.3] & /@ a]
{100707., 71762., 25625.6, 13508.}
Bunun yerine yalnızca bu 4 sonucu hesaplayabilirsiniz. MapThreadikisi üzerinde eşler ave baynı anda:
MapThread[angdist[#1, #2, 0.3] &, {a, b}]
{100707., 71762., 25625.6, 13508.}
Alternatif olarak angdist, Listableözniteliği verebilir ve basitçe geçebilir ave bbağımsız değişken olarak verebilirsiniz :
SetAttributes[angdist, Listable]
angdist[a, b, 0.3]
{100707., 71762., 25625.6, 13508.}