在 Python 中使用 odeint 求解 ODE 并继续集成

计算科学 Python 计算物理学 scipy
2021-12-23 07:41:08

以下与链接的问题有关:

对称势中的波散射(使用python)

我试图解决的问题,使用. 由此,我需要找到并继续集成到一个大的U(r)odeintarctan(U(r))r

我知道对于我应该使用arctannp.arctan

我的问题是我的代码出现尺寸错误,因此无法解决U(r)

我也不确定如何将集成继续进行到较大的价值。

我附上了我的代码(我是 Python 新手,所以对明显的错误表示歉意。)

我真的可以在这里得到帮助,谢谢。

"""
Code to integrate ODE to numerically solve phase-shifts for given
values of k and r
"""
import numpy as np
import scipy.special as sp
import matplotlib.pyplot as plt
from scipy.integrate import odeint


def pend(U, r, l, k, A):
    theta,  omega  =  U
    dUdr = [r,  (-k*(A**2)/(r**2))([sp.spherical_jn(l, z, derivative=False) \
           -(sp.spherical_yn(l, z,  derivative=False)*U(r))])**2]
    return dUdr


# Set limits and step 
rmin = 0
rmax = 100
dr = 1 

# Set up array of r-values
r = np.arange(rmin, rmax+dr, dr);
N = len(r);

# Set Constants
A = 35.3
l = [0.0, 1.0]
k = 0.5
r = 7
z = k*r

# set initial conditions
U0  =  [0.0]

# Solve
sol = odeint(pend, U0, r, args=(l, k, A))

# Plot
plt.legend(loc='best')
plt.xlabel('r')
plt.ylabel('U(r)')
plt.grid()
plt.show()
```
1个回答

由于您是 python 新手,我建议您查看有关如何使用 odeint 包并从那里构建解决方案的基本示例。这将需要一些时间,但您的代码会变得更加健壮。话虽如此,代码中有很多错误。您抱怨的错误是由于您已将评估点向量分配给变量 r 然后键入

r=7

它将 r 重新分配给 7,这是一个标量。解释器告诉您需要一个向量来计算时间步长 dt。

由于您没有指定数学模型,我将仅链接一个伪代码

import numpy as np
import scipy.special as sp
from scipy.integrate import odeint
import matplotlib.pyplot as plt

# Set limits, step and array
r = np.linspace(1,100,1000)

# Set Constants
A, l, k, rc = 35.3, [0.0, 1.0], 0.5, 7
z = k * rc

def pend(U, r):
    global A, l, rc, k
    theta, omega = U
    d_theta = ...
    d_omega = ...
    return [d_theta, d_omega]

sol = odeint(pend, [0.0,0.0], r)

我认为您应该使用这种结构并添加导数的表达式。当你编写函数来进行积分时,你应该记住它有两个参数,U 和 r。r 是您评估函数 U 的点,U 和 r 都是标量。由于变量 U 已经是 U(r),因此键入 U(r) 之类的内容毫无意义。

另请注意,您正在使用向量和列表(即简单的 [1,2,3])不实现您尝试执行的操作。我建议您使用 numpy 或像我在伪代码中那样计算组件的导数。我建议你只执行标量操作,所以表达一切。它们更容易调试和修改。

就集成而言,它实际上取决于您尝试离散化的模型。如果您知道对于较大的 r 值,解决方案会变得更加平滑,那么您可以采取越来越大的步骤(即构建一个带有 dr large 的向量)。某些模型需要更改变量,在您的情况下可能是 1/r。