所以对于我正在做的实习,我需要使用(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)))))))
答案 0 :(得分:2)
这是一个例子。当然,我不知道这是做什么的。正如其他人所指出的那样,你应该处于更好的位置来添加评论/合理的变量名称。不过,这是你能做的。
首先,运行代码格式化程序,使代码更加人性化。
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
一起更改,则应在函数内移动定义。
答案 1 :(得分:-2)
使用好的变量名称将有助于谁将会阅读代码甚至是你,而评论也会有所帮助。 对于其他人来说,这是一个等式,没有好办法。