python - 尝试使用 Solve_ivp 求解牛顿多面体,并且正确性因 n 的不同值而异?
问题描述
我正在尝试为多方状态方程求解牛顿恒星结构方程(我正在求解多方体)。我没有使用 Lane-Emden 方程。这应该是一个非常简单的代码,因为它是两个方程的简单线性系统。状态方程也很简单。
由于堆栈溢出不接受 tex 并且它不会让我嵌入图像。我不确定如何以简洁的方式将牛顿方程放在这里,所以这是我能做到的最好的:
dm/dr = 4 pi rho r^2
dp/dr = - G rho M / r^2
对于 n = 1,存在多方体的精确解,并且我的压力半径曲线完全匹配,并且数值半径在精确解半径的 0.0003% 误差范围内。
然而,对于 n=3,我得到的质量是 1.43 个太阳质量而不是 1.24。
对于 n=3/2,我计算的所有半径都是公布版本的 3.7 倍,质量是公布结果的 28 倍。我不确定是什么原因造成的。
我已经用无量纲量的几何单位编写了代码,并且所有东西都是 SI,我得到的结果是一致的。这告诉我,这不是来自处理大量数字的错误。所以我将 SI 代码放在这里,这样就不会因为单位和比例因子的变化而混淆。
多面体计算的代码是这样的:
#for gamma = 4/3
K = ((hbar * c) /(12*np.pi**2.)) * ((3*np.pi**2.)/(m_h))**(4./3.)
K = K * 0.5**(4./3.)
#for gamma = 5/3
K_nr = hbar_cgs**2.
K_nr = K_nr /(15. *np.pi**2. * me_cgs)
K_nr = K_nr * (3. * np.pi**2. )**(5./3.)
K_nr = K_nr * (mh_cgs)**(-5./3.)
K_nr = K_nr * 0.5**(5./3.)
#Equation of State
def EOS(p):
rho = (p/K)**(1./gamma)
return rho
def TOV(r,y):
M = y[0]
p = y[1]
rho = EOS(p)
#print p
dMdr = 4. * np.pi * rho * r**2.
dpdr = - G * M * rho /r**2.
#print dpdr
return [dMdr,dpdr]
def star_boundary(r,y):
return y[1]
#Set star boundary at pressure = 0
star_boundary.terminal = True
M_0 = 0.
r_0 = 0.01 #m
r_stop = 20. #km
r_stop = r_stop * 10.**(3.) #SI = m
t_span = (r_0,r_stop)
t_eval = np.linspace(r_0,r_stop,1000)
p0 = 10**33.
y0 = [M_0, p0]
soln = solve_ivp(TOV,t_span,y0,method='RK45', events=star_boundary, t_eval=t_eval, dense_output=True)
r = soln.t
M = soln.y[0]
p = soln.y[1]
计算精确解的代码在这里:
rho0 = EOS(p0)
R = (((1.+1.)*p0 )/(4*np.pi * g_cgs * rho0**2))**0.5 * np.pi
error = abs((r[-1] - R)/R)
print "percent error is ", error
R_s = (((1.+1.)*p0 )/(4*np.pi * g_cgs * rho0**2))**0.5
xi = r / R_s
theta = np.sin(xi) / xi
P = p0 * theta**(n+1)
我用 3 篇不同的论文检查了我的 K 值。我检查了输出 xi 是否等于 pi。在继续使用 GR 解决方案之前,我需要找到错误,但我很困惑。
我还检查了 r_0 的较小值(因为您实际上不能使用 r=0),我发现解决方案在这一点附近是稳定的。)
我还尝试降低积分器上的 rtol/atol,以防它只是累积错误,但将 rtol 从默认的 rtol=10E-3 更改为 10E-6 没有任何效果。
我还检查了 scipy.odeint
解决方案
更新:事实证明,我正在比较的出版物中存在错误。事实证明,大约 1.43 是正确的(它与 th Chandrasekhar 质量有关)
推荐阅读
- ios - 出现自定义侧菜单时如何隐藏状态栏的一部分
- swift - 在 Swift 中使用 DI 时避免使用胖初始化器
- vue.js - Vue.js,如何将 v-model 与数据数组一起使用?
- oracle - 通过自动化作业在 Oracle SQL Developer 中“导出数据库”
- scala - 从 Flink REPL 使用 Google Storage
- javascript - 在我的主机中加载 3d 模型时出现问题
- java - 如何使用 NetBeans 解决生成代码中的合并冲突?
- c++ - C++ Boost Beast 空响应体
- python - 为什么keras不允许以这种方式添加卷积层?
- php - reCAPTCHA 适用于本地主机,但不适用于我的主机