Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 算出方程式_Python_Algorithm_Ode - Fatal编程技术网

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):