我正在尝试用Python解决方程式。基本上我想要做的就是解决这个等式:
(1/x^2)*d(Gam*dL/dx)/dx)+(a^2*x^2/Gam-(m^2))*L=0
这是Schwarzschild时空中大量标量场的Klein-Gordon方程。它假设我们知道m
和Gam=x^2-2*x
。我知道的初始/边界条件是L(2+epsilon)=1
和L(infty)=0
。请注意,等式的渐近行为是
L(x-->infty)-->Exp[(m^2-a^2)*x]/x and Exp[-(m^2-a^2)*x]/x
然后,如果a^2>m^2
我们将有振荡解决方案,而如果a^2 < m^2
我们将有一个发散和衰减解决方案。
我感兴趣的是衰变解决方案,但是当我试图解决上述方程时,将其转换为一阶微分方程组并使用拍摄方法找到可以给我的“a”我感兴趣的行为,我总是有一个不同的解决方案。我想它正在发生,因为odeint
总是找到不同的渐近解。有没有办法避免或告诉odeint
我对衰变解决方案感兴趣?如果没有,你知道我可以解决这个问题的方法吗?也许使用另一种方法来解决我的微分方程系统?如果是,哪种方法?
基本上我正在做的是为“a”添加一个新的等式系统
(d^2a/dx^2=0, da/dx(2+epsilon)=0,a(2+epsilon)=a_0)
以“a”为常数。然后我正在考虑“a_0”的不同值,并询问我的边界条件是否得到满足。
感谢您的时间。的问候,
Luis P。
答案 0 :(得分:0)
考虑到渐近行为,我将无穷大的价值纳入其中,这意味着我将在该字段及其衍生物之间建立关系。如果它有用,我会为你发布代码:
from IPython import get_ipython
get_ipython().magic('reset -sf')
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from math import *
from scipy.integrate import ode
这些是Schwarzschild的初始条件。该字段在reescaling下是不变的,然后我可以使用$ L(2 + \ epsilon)= 1 $
def init_sch(u_sch):
om = u_sch[0]
return np.array([1,0,om,0]) #conditions near the horizon, [L_c,dL/dx,a,da/dx]
这些是我们的方程组
def F_sch(IC,r,rho_c,m,lam,l,j=0,mu=0):
L = IC[0]
ph = IC[1]
om = IC[2]
b = IC[3]
Gam_sch=r**2.-2.*r
dR_dr = ph
dph_dr = (1./Gam_sch)*(2.*(1.-r)*ph+L*(l*(l+1.))-om**2.*r**4.*L/Gam_sch+(m**2.+lam*L**2.)*r**2.*L)
dom_dr = b
db_dr = 0.
return [dR_dr,dph_dr,dom_dr,db_dr]
然后我尝试了不同的&#34; om&#34;并询问我的边界条件是否得到满足。 p_sch是我模型的参数。一般来说,我想要做的是稍微复杂一点,一般来说,我需要更多的参数,在大量的情况下。但是,我需要从最简单的开始,这就是我在这里要求的
p_sch = (1,1,0,0) #[rho_c,m,lam,l], lam and l are for a more complicated case
ep = 0.2
ep_r = 0.01
r_end = 500
n_r = 500000
n_omega = 1000
omega = np.linspace(p_sch[1]-ep,p_sch[1],n_omega)
r = np.linspace(2+ep_r,r_end,n_r)
tol = 0.01
a = 0
for j in range(len(omega)):
print('trying with $omega =$',omega[j])
omeg = [omega[j]]
ini = init_sch(omeg)
Y = odeint(F_sch,ini,r,p_sch,mxstep=50000000)
print Y[-1,0]
#Here I ask if my asymptotic behavior is fulfilled or not. This should be basically my value at infinity
if abs(Y[-1,0]*((p_sch[1]**2.-Y[-1,2]**2.)**(1/2.)+1./(r[-1]))+Y[-1,1]) < tol:
print(j,'times iterations in omega')
print("R'(inf)) = ", Y[-1,0])
print("\omega",omega[j])
omega_1 = [omega[j]]
a = 10
break
if a > 1:
break
基本上我想要做的是解决给出不同初始条件的方程组,并找到&#34; a =&#34;的值。 (或代码中的&#34; om&#34;)应该接近我的边界条件。我需要这个,因为在此之后我可以给这样的初始客人一个割线方法并试图为#34; a&#34;找到最好的价值。但是,总是我运行这个代码我有不同的解决方案,当然,这是一种我不感兴趣的行为。我正在尝试相同的但考虑到scipy.integrate.solve_vbp,但是当我运行以下代码时:
from IPython import get_ipython
get_ipython().magic('reset -sf')
import numpy as np
import matplotlib.pyplot as plt
from math import *
from scipy.integrate import solve_bvp
def bc(ya,yb,p_sch):
m = p_sch[1]
om = p_sch[4]
tol_s = p_sch[5]
r_end = p_sch[6]
return np.array([ya[0]-1,yb[0]-tol_s,ya[1],yb[1]+((m**2-yb[2]**2)**(1/2)+1/r_end)*yb[0],ya[2]-om,yb[2]-om,ya[3],yb[3]])
def fun(r,y,p_sch):
rho_c = p_sch[0]
m = p_sch[1]
lam = p_sch[2]
l = p_sch[3]
L = y[0]
ph = y[1]
om = y[2]
b = y[3]
Gam_sch=r**2.-2.*r
dR_dr = ph
dph_dr = (1./Gam_sch)*(2.*(1.-r)*ph+L*(l*(l+1.))-om**2.*r**4.*L/Gam_sch+(m**2.+lam*L**2.)*r**2.*L)
dom_dr = b
db_dr = 0.*y[3]
return np.vstack((dR_dr,dph_dr,dom_dr,db_dr))
eps_r=0.01
r_end = 500
n_r = 50000
r = np.linspace(2+eps_r,r_end,n_r)
y = np.zeros((4,r.size))
y[0]=1
tol_s = 0.0001
p_sch= (1,1,0,0,0.8,tol_s,r_end)
sol = solve_bvp(fun,bc, r, y, p_sch)
我收到此错误:ValueError:bc
返回预期有形状(11,),但实际上有(8,)。
ValueError:bc
返回预期有形状(11,),但实际上有(8,)。