一系列微分方程的 Runge-Kutta 四阶方法中的 numpy.float64 错误
numpy.float64 error in my Runge-Kutta 4th-order method for a series of differential equations
这是我用来最终绘制一些微分方程的四阶 Runge-Kutta 方法。
目标是创建一个 4 x 100,000x.1 数组,在时间步长的每个点给我 x, y, dx, dy
的值,这样我就可以用这 4 个参数绘制任何方程式。
#Assumptions
x0, y0 = -.250, .433
x1, y1 = -.250,-.433
x2, y2 = .500, .000
R = .2
C = .5
d = .25
#Imports
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as intgr
import math
#ag = [[ x0, y0], [ x1, y1], [ x2, y2]]
mag = [[-.250,.433], [-.250,-.433], [.500,.000]]
def der( xin, t ):
mag = [[-.250,.433],[-.250,-.433],[.500,.000]]
x = xin[0]
y = xin[1]
vx = xin[2]
vy = xin[3]
dx = vx
dy = vy
vx2 = 0
vy2 = 0
vx1 = -R * vx - C * x
vy1 = -R * vy - C * y
for i in range( mag.__len__() - 1 ):
vx2 = vx2 + ( ( mag[i][0] - x )
/ ( ( mag[i][0] - x )**2
+ ( mag[i][1] - y )**2
+ d**2
)**1.5
)
vy2 = vy2 + ( ( mag[i][1] - y )
/ ( ( mag[i][0] - x )**2
+ ( mag[i][1] - y )**2
+ d**2
)**1.5
)
vx3 = vx1 + vx2
vy3 = vy1 + vy2
array = [dx,dy,vx3,vy3]
return array
dt = .1
t = np.arange( 0, 100000, dt )
xzero = [.2, .2, 0, 0]
def RK4( func, xzero, t ):
rows = xzero.__len__()
columns = t.__len__()
x = np.zeros( ( rows, columns ) )
x_t = 0
ind = 0
x[:,ind] = xzero
dt = t[1] - t[0]
for time in t[0:len( t ) - 1]:
ind = ind + 1
K1 = dt * func( x[:,ind-1], time )
K2 = dt * func( x[:,ind-1] + .5 * K1, time + .5 * dt )
K3 = dt * func( x[:,ind-1] + .5 * K2, time + .5 * dt )
K4 = dt * func( x[:,ind-1] + K3, time + dt )
x[:,ind] = x[:,ind-1] + ( 1.0 / 6.0 ) * ( K1
+ 2 * K2
+ 2 * K3
+ K4
)
return x
print( RK4( func = der, xzero = xzero, t = t ) )
产生一个 numpy
浮点数 64 错误
我不太确定为什么我的代码中的某些变量没有被解释为数字?
提前感谢您的帮助,如果我应该提供更多代码或更大的上下文,请告诉我。
错误信息:
您正在尝试将浮点数与 list
.
的实例相乘
这种操作实际上是为整数定义的,您可以在其中获得输入列表的多个副本的串联(给定 a = [1, 2, 3]; print( 2*a )
returns [1, 2, 3, 1, 2, 3]
)。因此错误消息。
解决方案:
您需要始终如一地使用 numpy
,尤其是其 array
对象提供的向量算法。
首先,RK4()
中的 ODE 函数的 return 应该更清晰
如:
return np.array( [dx, dy, vx3, vy3] )
这是我用来最终绘制一些微分方程的四阶 Runge-Kutta 方法。
目标是创建一个 4 x 100,000x.1 数组,在时间步长的每个点给我 x, y, dx, dy
的值,这样我就可以用这 4 个参数绘制任何方程式。
#Assumptions
x0, y0 = -.250, .433
x1, y1 = -.250,-.433
x2, y2 = .500, .000
R = .2
C = .5
d = .25
#Imports
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as intgr
import math
#ag = [[ x0, y0], [ x1, y1], [ x2, y2]]
mag = [[-.250,.433], [-.250,-.433], [.500,.000]]
def der( xin, t ):
mag = [[-.250,.433],[-.250,-.433],[.500,.000]]
x = xin[0]
y = xin[1]
vx = xin[2]
vy = xin[3]
dx = vx
dy = vy
vx2 = 0
vy2 = 0
vx1 = -R * vx - C * x
vy1 = -R * vy - C * y
for i in range( mag.__len__() - 1 ):
vx2 = vx2 + ( ( mag[i][0] - x )
/ ( ( mag[i][0] - x )**2
+ ( mag[i][1] - y )**2
+ d**2
)**1.5
)
vy2 = vy2 + ( ( mag[i][1] - y )
/ ( ( mag[i][0] - x )**2
+ ( mag[i][1] - y )**2
+ d**2
)**1.5
)
vx3 = vx1 + vx2
vy3 = vy1 + vy2
array = [dx,dy,vx3,vy3]
return array
dt = .1
t = np.arange( 0, 100000, dt )
xzero = [.2, .2, 0, 0]
def RK4( func, xzero, t ):
rows = xzero.__len__()
columns = t.__len__()
x = np.zeros( ( rows, columns ) )
x_t = 0
ind = 0
x[:,ind] = xzero
dt = t[1] - t[0]
for time in t[0:len( t ) - 1]:
ind = ind + 1
K1 = dt * func( x[:,ind-1], time )
K2 = dt * func( x[:,ind-1] + .5 * K1, time + .5 * dt )
K3 = dt * func( x[:,ind-1] + .5 * K2, time + .5 * dt )
K4 = dt * func( x[:,ind-1] + K3, time + dt )
x[:,ind] = x[:,ind-1] + ( 1.0 / 6.0 ) * ( K1
+ 2 * K2
+ 2 * K3
+ K4
)
return x
print( RK4( func = der, xzero = xzero, t = t ) )
产生一个 numpy
浮点数 64 错误
我不太确定为什么我的代码中的某些变量没有被解释为数字?
提前感谢您的帮助,如果我应该提供更多代码或更大的上下文,请告诉我。
错误信息:
您正在尝试将浮点数与 list
.
这种操作实际上是为整数定义的,您可以在其中获得输入列表的多个副本的串联(给定 a = [1, 2, 3]; print( 2*a )
returns [1, 2, 3, 1, 2, 3]
)。因此错误消息。
解决方案:
您需要始终如一地使用 numpy
,尤其是其 array
对象提供的向量算法。
首先,RK4()
中的 ODE 函数的 return 应该更清晰
如:
return np.array( [dx, dy, vx3, vy3] )