Python 算出方程式
我试图用数值方法解一个微分方程,我正在写一个方程,它会给我一系列的解,每个时间点Python 算出方程式,python,algorithm,ode,Python,Algorithm,Ode,我试图用数值方法解一个微分方程,我正在写一个方程,它会给我一系列的解,每个时间点 import numpy as np import matplotlib.pylab as plt pi=np.pi sin=np.sin cos=np.cos sqrt=np.sqrt alpha=pi/4 g=9.80665 y0=0.0 theta0=0.0 sina = sin(alpha)**2 second_term = g*sin(alpha)*cos(alpha) x0 = float(ra
import numpy as np
import matplotlib.pylab as plt
pi=np.pi
sin=np.sin
cos=np.cos
sqrt=np.sqrt
alpha=pi/4
g=9.80665
y0=0.0
theta0=0.0
sina = sin(alpha)**2
second_term = g*sin(alpha)*cos(alpha)
x0 = float(raw_input('What is the initial x in meters?'))
x_vel0 = float(raw_input('What is the initial velocity in the x direction in m/s?'))
y_vel0 = float(raw_input('what is the initial velocity in the y direction in m/s?'))
t_f = int(raw_input('What is the maximum time in seconds?'))
r0 = x0
vtan = sqrt(x_vel0**2+y_vel0**2)
dt = 1000
n = range(0,t_f)
r_n = r0*(n*dt)
r_nm1 = r0((n-1)*dt)
F_r = ((vtan**2)/r_n)*sina-second_term
r_np1 = 2*r_n - r_nm1 + dt**2 * F_r
data = [r0]
for time in n:
data.append(float(r_np1))
print data
我不知道如何使方程在n范围内的每次r_np1求解。我对Python还是新手,希望能得到一些帮助,了解如何执行类似操作。第一个问题是:
n=范围(0,t\u f)
r_n=r0*(n*dt)
这里您将n定义为一个列表,并尝试将列表n与整数dt相乘。这是行不通的。纯Python不是一种像NumPy或Matlab这样的向量化语言,在这里您可以像这样进行向量乘法。你可以用它来做这行
n=np.arange(0,t\u f)
r_n=r0*(n*dt)
但你不必这么做。相反,您应该在for循环中移动所有内容,以便在每个时间步进行计算。此时,您只需进行一次计算,然后将相同的唯一结果t\f
时间添加到数据
列表中
当然,您必须将初始条件(这是ODE求解的关键部分)留在循环之外,因为它们只影响解决方案的第一步,而不是全部
因此:
我没有添加任何代码,只是重新排列了您的行。请注意,该部分:
n = range(0,t_f)
for time in n:
可简化为:
for time in range(0,t_f):
但是,在计算中使用n
作为时间变量(以前错误地定义为列表而不是单个数字)。因此,你可以写:
for n in range(0,t_f):
注1:我不知道这个代码在数学上是否正确,因为我甚至不知道你正在解的方程。代码现在运行并提供一个结果-您必须检查结果是否良好
注2:纯Python并不是用于此目的的最佳工具。您应该尝试一些高度优化的SciPy内置代码来解决ODE问题,因为您已经在注释中得到了提示 在循环之前,你只计算了一次r_np1。您应该尝试将该行移动到for循环中。@munkhd-ahh,有道理!我在第43行得到一个错误:r_n=r0*(n*dt):不能将序列乘以“float”类型的非int。我是否应该将n下的所有内容移动到循环中?与其尝试用纯Python编写自己的ODE解算器,我建议使用。它为您完成了大部分工作,而且速度也会快得多。@SvenMarnach我尝试使用odeint(),但无法使其工作,因为这是二阶的,我想odeint()只能用于一阶?您要解的方程到底是什么?
for n in range(0,t_f):