洛伦兹方程的运行时警告
RuntimeWarning with The Lorenz Equations
我正在尝试在 python 中求解洛伦兹方程(我正在学习 Mark Newman 的练习 8.3 - 计算物理学(2012 年,CreateSpace 独立出版平台))
我已经得到了图形,一切看起来都“正确”。这可能是一个数学问题,而不是真正的编程问题,但我在这里发帖以确保。
首先,这是我的代码:
from numpy import arange,array
import pylab
def f(v,t):
s=10
r=28
b=8/3
x= v[0]
y= v[1]
z= v[2]
fx= s*(y - x)
fy= r*x - y - x*z
fz= x*y - b*z
return array([fx,fy,fz],float)
def d(N):
a=0.0
b=50.0
h=(b-a)/N
r=array([0.0,1.0,0.0],float)
tpoints=arange(a,b,h)
xpoints= []
ypoints= []
zpoints= []
for t in tpoints:
xpoints.append(r[0])
ypoints.append(r[1])
zpoints.append(r[2])
k1 = h*f(r,t)
k2 = h*f(r+0.5*k1,t+0.5*h)
k3 = h*f(r+0.5*k2,t+0.5*h)
k4 = h*f(r+k3,t+h)
r += (k1+2*k2+2*k3+k4)*(1/6)
return tpoints,xpoints,ypoints,zpoints
for i in range (1,6):
N=10**i
pylab.plot(d(N)[0],d(N)[1], label=N)
pylab.xlabel("t")
pylab.ylabel("x(t)")
pylab.title("Gráficos x em função de t")
pylab.legend()
pylab.show()
pylab.plot(d(N)[0],d(N)[2], label=N)
pylab.xlabel("t")
pylab.ylabel("y(t)")
pylab.title("Gráficos y em função de t")
pylab.legend()
pylab.show()
pylab.plot(d(N)[0],d(N)[3], label=N)
pylab.xlabel("t")
pylab.ylabel("z(t)")
pylab.title("Gráficos z em função de t")
pylab.legend()
pylab.show()
pylab.plot(d(N)[1],d(N)[3], label=N)
pylab.xlabel("x")
pylab.ylabel("z(x)")
pylab.title("Gráficos z em função de x")
pylab.legend()
pylab.show()
这给了我解决问题的图表,我认为这是正确的。
当我从 i=1
转到 i=3
时,它给我这个错误:
我认为这与数学问题有关,但是当我搜索错误时,它让我找到了一些数组。所以我正在检查它。
对于 i
等于或大于 4,我没问题。
使用 RK4 的洛伦兹系统需要约 0.05
或更小的步长,即 N=10**4
或更大的构造。查看接近的副本 。
对于较大的步长,即出现错误的情况,该方法将 return 混乱的结果,这些结果大多与系统的精确解及其相关的任何边界无关。因此,由于二次超线性项,浮点溢出可能会出现分歧。
我正在尝试在 python 中求解洛伦兹方程(我正在学习 Mark Newman 的练习 8.3 - 计算物理学(2012 年,CreateSpace 独立出版平台)) 我已经得到了图形,一切看起来都“正确”。这可能是一个数学问题,而不是真正的编程问题,但我在这里发帖以确保。 首先,这是我的代码:
from numpy import arange,array
import pylab
def f(v,t):
s=10
r=28
b=8/3
x= v[0]
y= v[1]
z= v[2]
fx= s*(y - x)
fy= r*x - y - x*z
fz= x*y - b*z
return array([fx,fy,fz],float)
def d(N):
a=0.0
b=50.0
h=(b-a)/N
r=array([0.0,1.0,0.0],float)
tpoints=arange(a,b,h)
xpoints= []
ypoints= []
zpoints= []
for t in tpoints:
xpoints.append(r[0])
ypoints.append(r[1])
zpoints.append(r[2])
k1 = h*f(r,t)
k2 = h*f(r+0.5*k1,t+0.5*h)
k3 = h*f(r+0.5*k2,t+0.5*h)
k4 = h*f(r+k3,t+h)
r += (k1+2*k2+2*k3+k4)*(1/6)
return tpoints,xpoints,ypoints,zpoints
for i in range (1,6):
N=10**i
pylab.plot(d(N)[0],d(N)[1], label=N)
pylab.xlabel("t")
pylab.ylabel("x(t)")
pylab.title("Gráficos x em função de t")
pylab.legend()
pylab.show()
pylab.plot(d(N)[0],d(N)[2], label=N)
pylab.xlabel("t")
pylab.ylabel("y(t)")
pylab.title("Gráficos y em função de t")
pylab.legend()
pylab.show()
pylab.plot(d(N)[0],d(N)[3], label=N)
pylab.xlabel("t")
pylab.ylabel("z(t)")
pylab.title("Gráficos z em função de t")
pylab.legend()
pylab.show()
pylab.plot(d(N)[1],d(N)[3], label=N)
pylab.xlabel("x")
pylab.ylabel("z(x)")
pylab.title("Gráficos z em função de x")
pylab.legend()
pylab.show()
这给了我解决问题的图表,我认为这是正确的。
当我从 i=1
转到 i=3
时,它给我这个错误:
我认为这与数学问题有关,但是当我搜索错误时,它让我找到了一些数组。所以我正在检查它。
对于 i
等于或大于 4,我没问题。
使用 RK4 的洛伦兹系统需要约 0.05
或更小的步长,即 N=10**4
或更大的构造。查看接近的副本
对于较大的步长,即出现错误的情况,该方法将 return 混乱的结果,这些结果大多与系统的精确解及其相关的任何边界无关。因此,由于二次超线性项,浮点溢出可能会出现分歧。