Python中的Odeint、打靶方法和边界条件
我一直在研究odeint和边界条件。基本上,我想做的是解这个图中给出的微分方程 在我的代码中,R=R,ph=Phi,al=alpha,a=a,m=m,l=l,om=ω。我试图实现的初始条件是R(0)=O(R^l);如果l/=0,则φ(0)=O(r^{l-1}),如果l=0,则φ(0)=O(r);a(0)=1和a(inf)=1/alpha(inf)(另外我需要R(inf)=0)。我尝试应用打靶法,以便找到与边界条件最匹配的alpha初始条件。我还需要找到ω,它最符合无穷远处R的边界条件。我编写的代码如下:Python中的Odeint、打靶方法和边界条件,python,methods,conditional-statements,boundary,odeint,Python,Methods,Conditional Statements,Boundary,Odeint,我一直在研究odeint和边界条件。基本上,我想做的是解这个图中给出的微分方程 在我的代码中,R=R,ph=Phi,al=alpha,a=a,m=m,l=l,om=ω。我试图实现的初始条件是R(0)=O(R^l);如果l/=0,则φ(0)=O(r^{l-1}),如果l=0,则φ(0)=O(r);a(0)=1和a(inf)=1/alpha(inf)(另外我需要R(inf)=0)。我尝试应用打靶法,以便找到与边界条件最匹配的alpha初始条件。我还需要找到ω,它最符合无穷远处R的边界条件。我编写的代
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
import time
start = time.clock()
def system_DE(IC,p,r):
l = p[0]
m = p[1]
om = p[2]
R = IC[0]
ph = IC[1]
a = IC[2]
al = IC[3]
dR_dr = ph
da_dr = a*((2*l+1)*r/2*(om**2*a**2*R**2/al**2+ph**2+l*(l+1)*a**2*R**2/r**2+m**2*a**2*R**2)-(a**2-1)/(2*r))
dal_dr = al*(da_dr/a-l*(l+1)*(2*l+1)*a**2*R**2/r-(2*l+1)*m**2*a**2*r*R**2+(a**2-1)/r)
dph_dr = -2*ph/r-dal_dr*ph/al+da_dr*ph/a-om**2*a**2*R/al**2+l*(l+1)*a**2*R/r**2+m**2*a**2*R
return [dR_dr,da_dr,dal_dr,dph_dr]
def init(u,p,r):
if p==0:
return np.array([1,r,1,u])
else:
return np.array([r**l,l*r**(l-1),1,u])
l = 0
m = 1
ep = 0.3
n_om = 10
omega = np.linspace(m-ep,m+ep,n_om)
r = np.linspace(0.0001, 100, 1000)
niter = 100
u = 0
tol = 0.1
ustep = 0.01
p = np.zeros(3)
p[0] = l
p[1] = m
for j in range(len(omega)):
p[2] = omega[j]
for i in range(niter):
u += ustep
Y = odeint(system_DE(init(u,p[0],r[0]),p,r), init(u,p[0],r[0]), r)
print Y[-1,2]
print Y[-1,3]
if abs(Y[len(Y)-1,2]-1/Y[len(Y)-1,3]) < tol:
print(i,'times iterations')
print("a'(inf)) = ", Y[len(Y)-1,2])
print('y"(0) =',u)
break
if abs(Y[len(Y)-1,0]) < tol:
print(j,'times iterations in omega')
print("R'(inf)) = ", Y[len(Y)-1,0])
break
将numpy导入为np
将matplotlib.pyplot作为plt导入
从scipy.integrate导入odeint
导入时间
开始=时间。时钟()
def系统(IC、p、r):
l=p[0]
m=p[1]
om=p[2]
R=IC[0]
ph=IC[1]
a=IC[2]
al=IC[3]
dR_dR=ph
da_dr=a*((2*l+1)*r/2*(om**2*a**2*r**2/al**2+ph**2+l*(l+1)*a**2*r**2/r**2+m**2*a**2*r**2)-(a**2-1)/(2*r))
dal_dr=al*(dau dr/a-l*(l+1)*(2*l+1)*a**2*R**2/R-(2*l+1)*m**2*a**2*R**2+(a**2-1)/R)
dph\u dr=-2*ph/r-dal\u dr*ph/al+da\u dr*ph/a-om**2*a**2*r/al**2+l**(l+1)*a**2*r/r**2+m**2*a**2*r**
返回[dR_dR,da_dR,dal_dR,dph_dR]
def初始(u、p、r):
如果p==0:
返回np.array([1,r,1,u])
其他:
返回np.数组([r**l,l*r**(l-1),1,u])
l=0
m=1
ep=0.3
n_om=10
ω=np.linspace(m-ep,m+ep,n_om)
r=np.linspace(0.000110000)
硝酸盐=100
u=0
tol=0.1
ustep=0.01
p=np.零(3)
p[0]=l
p[1]=m
对于范围内的j(len(ω)):
p[2]=ω[j]
对于范围内的i(niter):
u+=ustep
Y=odeint(系统_DE(init(u,p[0],r[0]),p,r),init(u,p[0],r[0]),r)
打印Y[-1,2]
打印Y[-1,3]
如果abs(Y[len(Y)-1,2]-1/Y[len(Y)-1,3])
然而,当我运行它时,我得到:error:函数及其雅可比矩阵必须是可调用函数
有人能帮我理解我的错误是什么吗
问候,
Luis Padilla。首先,odeint的第一个参数是你的导数函数系统。只需传递它的名称,没有括号或参数。odeint在内部调用它并提供参数。我修复了我的代码,现在它给了我一些结果。但是,当我运行它时,我得到了一些警告,我不知道怎么做有人能帮我解决吗?基本上我的代码是:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
import time
def system_DE(IC,r,l,m,om):
R = IC[0]
ph = IC[1]
a = IC[2]
al = IC[3]
dR_dr = ph
da_dr = a*((2*l+1)*r/2*(om**2*a**2*R**2/al**2+ph**2+l*(l+1)*a**2*R**2/r**2+m**2*a**2*R**2)-(a**2-1)/(2*r))
dal_dr = al*(da_dr/a-l*(l+1)*(2*l+1)*a**2*R**2/r-(2*l+1)*m**2*a**2*r*R**2+(a**2-1)/r)
dph_dr = -2*ph/r-dal_dr*ph/al+da_dr*ph/a-om**2*a**2*R/al**2+l*(l+1)*a**2*R/r**2+m**2*a**2*R
return [dR_dr,dph_dr,da_dr,dal_dr]
def init(u,p,r):
if p==0:
return np.array([1.,r,1.,u])
else:
return np.array([r**p,l*r**(p-1),1,u])
l = 0.
m = 1.
ep = 0.2
n_om = 30
omega = np.linspace(m-ep,m+ep,n_om)
r = np.linspace(0.001, 100, 1000)
niter = 1000
tol = 0.01
ustep = 0.01
for j in range(len(omega)):
print('trying with $omega =$',omega[j])
p = (l,m,omega[j])
u = 0.001
for i in range(niter):
u += ustep
ini = init(u,p[0],r[0])
Y = odeint(system_DE, ini,r,p,mxstep=500000)
if abs(Y[len(Y)-1,2]-1/Y[len(Y)-1,3]) < tol:
break
if abs(Y[len(Y)-1,0]) < tol and abs(Y[len(Y)-1,2]-1/Y[len(Y)-1,3]) < tol:
print(j,'times iterations in omega')
print(i,'times iterations')
print("R'(inf)) = ", Y[len(Y)-1,0])
print("alpha(0)) = ", Y[0,3])
print("\omega",omega[j])
break
plt.subplot(2,1,1)
plt.plot(r,Y[:,0],'r',label = '$R$')
plt.plot(r,Y[:,1],'b',label = '$d R /dr$')
plt.xlim([0,10])
plt.legend()
plt.subplot(2,1,2)
plt.plot(r,Y[:,2],'r',label = 'a')
plt.plot(r,Y[:,3],'b', label = '$alpha$')
plt.xlim([0,10])
plt.legend()
plt.show()
我怎样才能解决这个问题
问候,
路易斯·帕迪拉
lsoda-- warning..internal t (=r1) and h (=r2) are
such that in the machine, t + h = t on the next step
(h = step size). solver will continue anyway
in above, r1 = 0.1243782486482D+01 r2 = 0.8727680448722D-16