Python3: Как мне сделать это уравнение читабельным? - PullRequest
0 голосов
/ 29 мая 2018

Так что для этой стажировки, которую я делаю, мне нужно использовать интеграл (x ^ (9/2)) / ((1-x) ^ 2) как часть уравнения, которое я строю.Однако переменная, которую я строю на графике вдоль оси x, появляется в обоих пределах интегрирования.Поскольку я являюсь полным и полным новичком в python, мой код ужасен, но в итоге я скопировал + вставил неопределенный интеграл дважды, включив пределы интеграции и вычитая.Как я могу сделать код лучше?

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate

x = np.arange(0,2.5,0.00001)

zs = 8
zr = 6
rbub = 5
sig = 2.5
XHI = 0.5
sigma = 10**-sig
L = 10**-3
zb = zs - (((1 + zs)/8)**(3/2)) * (0.0275) * (rbub/10)
a = (1+zr)/((1+zs)*(x+1))
b = (1+zb)/((1+zs)*(x+1))

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)))))))

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вот один дубль.Конечно, я понятия не имею, что это делает.Вы должны быть в гораздо лучшем положении, чтобы добавлять комментарии / разумные имена переменных, как указывали другие.Тем не менее, вот что вы могли бы сделать.

Сначала запустите средство форматирования кода, чтобы сделать код более удобным для человека.

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, вы должны переместить определения внутри функции.

0 голосов
/ 29 мая 2018

Использование хороших имен переменных очень поможет тем, кто будет читать код или даже вам, и комментарии также помогут.В остальном, это уравнение, нет хорошего способа выразить это.

...