使用numpy.array()返回python函数

使用numpy.array()返回python函数,python,Python,我正在为我的常微分方程类编写python代码,我必须使用数值方法(RK4)对牛顿第二运动定律进行建模。我相信我的代码是正确的,因为我自己亲手计算了微分方程,并验证了结果 我想缩短我的代码长度,将类似的ODE函数分组在一起,但是我遇到了一个关于返回类型的错误。以下是我迄今为止的工作: import numpy as np import matplotlib.pyplot as plt t0 = 0.0 # Start time tf = 10.0

我正在为我的常微分方程类编写python代码,我必须使用数值方法(RK4)对牛顿第二运动定律进行建模。我相信我的代码是正确的,因为我自己亲手计算了微分方程,并验证了结果

我想缩短我的代码长度,将类似的ODE函数分组在一起,但是我遇到了一个关于返回类型的错误。以下是我迄今为止的工作:

import numpy as np
import matplotlib.pyplot as plt

t0 = 0.0                # Start time
tf = 10.0               # End time
h = 0.001               # step size
t = np.arange(t0,tf,h)  # Time Points
v0 = 20                 # Initial velocity in m/s
theta = 45              # Launch angle
Uy = v0 * np.sin(theta*np.pi/180) # Initial velocity in y component
Ux = v0 * np.cos(theta*np.pi/180) # Initial velocity in x component


def velocity_y(t,v):
    g  = 9.81               # Acceleration of free fall
    dVy_dt = -g
    
    return dVy_dt

def velocity_x(t,v):
    dVx_dt = 0
    
    return dVx_dt

def velocity_xy(t,v):
    g  = 9.81               # Acceleration of free fall
    dVy_dt = -g
    dVx_dt = 0
    
    return np.array([dVy_dt,dVx_dt])

p1,p2 = velocity_xy(t,v)

def rk4( f, x0, t):        
    n = len( t )
    x = np.zeros(n)
    x[0] = x0
    for i in range( n - 1 ):
        h = t[i+1] - t[i]
        k1 = h * f( x[i], t[i] )
        k2 = h * f( x[i] + 0.5 * k1, t[i] + 0.5 * h )
        k3 = h * f( x[i] + 0.5 * k2, t[i] + 0.5 * h )
        k4 = h * f( x[i] + k3, t[i+1] )
        x[i+1] = x[i] + ( k1 + 2.0 * ( k2 + k3 ) + k4 ) / 6.0

    return x

r = rk4(velocity_y,Uy,t)
r1 = rk4(velocity_x,Ux,t)
plt.plot(t,r1,'gx',linestyle='-',label='Velocity in y direction')
plt.xlabel('t or x')
plt.ylabel('v(t) or y(x)')
plt.legend()
plt.grid()
plt.show()
我实现了我的ODE功能,如下所示:

def velocity_y(t,v):
    g  = 9.81               # Acceleration of free fall
    dVy_dt = -g
    
    return dVy_dt

def velocity_x(t,v):
    dVx_dt = 0
    
    return dVx_dt

def velocity_xy(t,v):
    g  = 9.81               # Acceleration of free fall
    dVy_dt = -g
    dVx_dt = 0
    
    return np.array([dVy_dt,dVx_dt])
p1,p2 = velocity_xy(t,v)
我试图将相似的ODE分组到相同的函数类型中,以避免仅仅为了定义新ODE而过度创建新函数

def velocity_xy(t,v):
        g  = 9.81               # Acceleration of free fall
        dVy_dt = -g
        dVx_dt = 0
        
        return np.array([dVy_dt,dVx_dt])
我认为错误在于:

p1,p2 = velocity_xy(t,v)
但我不知道正确的语法。来自程序的错误:

    NameError                                 Traceback (most recent call last)
<ipython-input-37-4ce3cb1658cb> in <module>
     30     return np.array([dVy_dt,dVx_dt])
     31 
---> 32 p1,p2 = velocity_xy(t,v)
     33 #-----------------------------------------------------------------------------
     34 

NameError: name 'v' is not defined
namererror回溯(最近一次调用)
在里面
30返回np.数组([dVy\u dt,dVx\u dt])
31
--->32 p1,p2=速度_xy(t,v)
33 #-----------------------------------------------------------------------------
34
NameError:未定义名称“v”

如果有任何有用的答案和评论,我将不胜感激。

我相信主要问题是您正在将v作为
def velocity_xy(t,v)
函数的参数传递,但没有在代码中的任何地方声明它的值。

我相信主要问题是您正在将v作为
def velocity_xy(t,v)的参数传递
函数,但不在代码中的任何位置声明其值