我正在尝试获取以下等式的分叉图:
(x是t的函数)
为:
这是我的片段:
import numpy as np
import matplotlib.pyplot as plt
def pitch(r, x):
return r * x + np.power(x,3)- np.power(x,5)
n = 10000
r = np.linspace(-200, 200, n)
iterations = 1000
last = 100
x = 0
for i in range(iterations):
x = pitch(r,x)
if i >= (iterations - last):
plt.plot(r,x, ',k', alpha=0.02)
plt.title("Bifurcation diagram")
plt.show()
但生成的情节并非如此:
修改
这是我最近的尝试:
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
def pitch(s,x,r):
x = s[0]
dxdt = r * x + np.power(x,3)- np.power(x,5)
return [dxdt]
t = np.linspace(0,100)
s0=[-50]
r = np.linspace(-200, 200)
for i in r:
s = odeint(pitch,s0,t, args=(i,))
plt.plot(s,i,',k', alpha=0.02)
plt.title("Bifurcation diagram")
plt.show()
出现此错误:
引发ValueError(“x和y必须具有相同的第一个维度”)ValueError: x和y必须具有相同的第一维
你能给我一些建议来解决这个问题吗?!
答案 0 :(得分:1)
我找到了这篇文章的链接,并决定发表一些可能对将来绊倒它的人有所帮助的评论。
我没有详细分析这个等式,但从第一眼看出,当r
接近0时会发生一些有趣的事情。
因此,我们可以研究r in [-10,10]
使用odeint
而不是使用自己编码的Euler方法解决Cauchy问题是正确的。
这个等式有一个吸引子,因为它很快“忘记”初始条件并向吸引子滑动,但吸引子的选择取决于我们从0开始的位置。大的正初始条件会滑到负吸引子,反之亦然,因为- x^5
是定义大x
行为的术语。
我们需要做的是对于范围中的每个r在吸引器上标记解决方案为每个初始条件滑动。
我们首先创建一个画布以将标记放入:
diagram = np.zeros((200,200))
然后对于(r,s0)
的每个组合,我们在(r,s[-1])
的画布上放置了一个点。
这是完整的代码
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
def pitch(s,x,r):
x = s[0]
dxdt = r * x + np.power(x,3)- np.power(x,5)
return [dxdt]
t = np.arange(0,100,2)
s0=[-50]
N = 200 # Number of points along each side of the diagram
diagram = np.zeros((N,N))
rmin,rmax = -10,10
rrange = np.arange(rmin, rmax,(rmax-rmin)/N)
smin,smax = -5.0,5.0
srange = np.arange(smin,smax,2*(smax-smin)/N)
for i in rrange:
for s0 in srange:
s = odeint(pitch,[s0],t, args=(i,))
imgx = int((i-rmin)*N/(rmax-rmin))
imgy = int((s[-1]-smin)/(smax-smin)*N)
imgx = min(N-1,max(0,imgx)) # make sure we stay
imgy = min(N-1,max(0,imgy)) # within the diagram bounds
diagram[imgy,imgx] = 1
plt.title("Bifurcation diagram")
plt.imshow(np.flipud(diagram),cmap=cm.Greys,
extent=[rmin,rmax,smin,smax],aspect=(rmax-rmin)/(smax-smin))
plt.xlabel("r")
plt.ylabel("x")
plt.show()
结果情节
当您通过将(rmin,rmax)
设置为(-0.5,0.5)
放大到0左右的区域时,您可以看到图表的分支不是从0开始
相反,如在原始帖子中绘制的图表中,分支从大约r=-0.25