与python的分叉图

时间:2017-10-30 17:30:06

标签: python

我是初学者,我不会说英语,所以很抱歉。 我想绘制序列的分叉图: x(n + 1)= u x(n)(1-x(n)),x(0)= 0.7,u介于0.7和4之间。

我应该得到这样的东西:

https://i.stack.imgur.com/T4gyF.png

因此,对于u的每个值,我想计算该序列的累积点。这就是为什么我想编写一些可以显示每个点(u; x1001),(u; x1002)...(u; x1050)的每个值的原因。

我这样做了:

import matplotlib.pyplot as plt
import numpy as np
P=np.linspace(0.7,4,10000)
m=0.7
Y=[m]
l=np.linspace(1000,1050,51)
for u in P:
    X=[u]
    for n in range(1001):
      m=(u*m)*(1-m)
    break 
    for l in range(1051):
      m=(u*m)*(1-m)
      Y.append(m)
plt.plot(X,Y)
plt.show()

而且,我得到一张空白图片。

这是我尝试编码的第一件事,我在Python中什么都不知道,所以我需要帮助。

2 个答案:

答案 0 :(得分:4)

您的代码中存在一些问题。虽然你遇到的问题是代码审查问题,但生成分叉图是一个普遍感兴趣的问题(它可能需要在scicomp上重新定位,但我不知道如何正式请求)。

import matplotlib.pyplot as plt
import numpy as np
P=np.linspace(0.7,4,10000)
m=0.7
# Initialize your data containers identically
X = []
Y = []
# l is never used, I removed it.
for u in P:
    # Add one value to X instead of resetting it.
    X.append(u)
    # Start with a random value of m instead of remaining stuck
    # on a particular branch of the diagram
    m = np.random.random()
    for n in range(1001):
      m=(u*m)*(1-m)
    # The break is harmful here as it prevents completion of
    # the loop and collection of data in Y 
    for l in range(1051):
      m=(u*m)*(1-m)
    # Collection of data in Y must be done once per value of u
    Y.append(m)
# Remove the line between successive data points, this renders
# the plot illegible. Use a small marker instead.
plt.plot(X, Y, ls='', marker=',')
plt.show()

此外,X在这里没用,因为它包含P的副本。

答案 1 :(得分:0)

要以png格式保存分叉图,您可以尝试使用this简单代码。

# Bifurcation diagram of the logistic map

import math
from PIL import Image
imgx = 1000
imgy = 500
image = Image.new("RGB", (imgx, imgy))

xa = 2.9
xb = 4.0
maxit = 1000

for i in range(imgx):
    r = xa + (xb - xa) * float(i) / (imgx - 1)
    x = 0.5
    for j in range(maxit):
        x = r * x * (1 - x)
        if j > maxit / 2:
            image.putpixel((i, int(x * imgy)), (255, 255, 255))

image.save("Bifurcation.png", "PNG")