Вот один дубль.Конечно, я понятия не имею, что это делает.Вы должны быть в гораздо лучшем положении, чтобы добавлять комментарии / разумные имена переменных, как указывали другие.Тем не менее, вот что вы могли бы сделать.
Сначала запустите средство форматирования кода, чтобы сделать код более удобным для человека.
def f(x):
ans = 0.000140092
ans = ans * ((1 + zs) ** (3 / 2))
ans = ans * ((x + 1) ** (3 / 2))
ans = ans * XHI
return ans * (
(9 / 2) * (np.log(1 - np.sqrt(b)) - np.log(np.sqrt(b) + 1))
+ (
1
/ 35
* (1 / (b - 1))
* (
10 * (b ** (9 / 2))
+ 18 * (b ** (7 / 2))
+ 42 * (b ** (5 / 2))
+ 210 * (b ** (3 / 2))
- 315 * (b ** (1 / 2))
)
- (
(9 / 2) * (np.log(1 - np.sqrt(a)) - np.log(np.sqrt(a) + 1))
+ (
1
/ 35
* (1 / (a - 1))
* (
10 * (a ** (9 / 2))
+ 18 * (a ** (7 / 2))
+ 42 * (a ** (5 / 2))
+ 210 * (a ** (3 / 2))
- 315 * (a ** (1 / 2))
)
)
)
)
)
Сразу же вы увидите некоторую симметрию.Этот кусок
10 * (b ** (9 / 2))
+ 18 * (b ** (7 / 2))
+ 42 * (b ** (5 / 2))
+ 210 * (b ** (3 / 2))
- 315 * (b ** (1 / 2))
является точечным произведением некоторых весов и b
, возведенных в вектор степеней.Если бы b
было скалярным, мы могли бы написать это как np.dot(weights, np.sqrt(b) ** powers)
.Может быть, мы даже набрали бы несколько баллов за оптимизацию за счет использования интегральных степеней.
Собрав все вместе, мы можем получить что-то вроде этого:
weights = np.array([10, 18, 42, 210, -315])
powers = np.array([9, 7, 5, 3, 1])
def log_term(x):
return (9 / 2) * (np.log(1 - np.sqrt(x)) - np.log(np.sqrt(x) + 1))
def dot_term(x):
return (1 / 35) * 1 / (x - 1) * np.dot(np.sqrt(x)[..., None] ** powers, weights)
def integrate(x):
return log_term(x) + dot_term(x)
factor1 = integrate(b) - integrate(a)
factor2 = 0.000140092 * ((1 + zs) ** (3 / 2)) * XHI
factor = factor1 * factor2
def f(x):
return factor * ((x + 1) ** (3 / 2))
С лучшими именами переменных и комментариями это может быть почти читабельным.
Дополнительный комментарий.Как в исходном коде, так и в этой версии вы определяете x
в теле вашего скрипта.Вы также определяете несколько переменных как функцию x
, например a
и b
.
Правила области видимости Python означают, что эти переменные не изменятся, если вы передадите другой x
в f
.Если вы хотите, чтобы все ваши переменные изменялись с x
, вы должны переместить определения внутри функции.