matplotlib中的分叉图

时间:2017-04-04 00:57:39

标签: python matplotlib

我正在尝试获取以下等式的分叉图:

formula

(x是t的函数)

为:

enter image description here

这是我的片段:

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

但生成的情节并非如此:

enter image description here

修改

这是我最近的尝试:

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必须具有相同的第一维

你能给我一些建议来解决这个问题吗?!

1 个答案:

答案 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()

结果情节

Bifurcation plot for the pitch equation

当您通过将(rmin,rmax)设置为(-0.5,0.5)放大到0左右的区域时,您可以看到图表的分支不是从0开始

Zooming in around 0

相反,如在原始帖子中绘制的图表中,分支从大约r=-0.25

开始