Python中的定点迭代和绘图

时间:2011-04-06 18:51:57

标签: python plot

给定函数g(x),我想找到这个函数的固定点 fixed point iteration。除了找到点本身之外,我想使用matplotlib.pyplot将图形绘制到函数中,并包括显示迭代如何在固定点(如果存在)上关闭的垂直和水平条。 Example picture

所有帮助表示赞赏! /编程新手

编辑:由于我对生成器对象不太满意,我编写了以下代码。虽然不太合适:它有什么问题?

from matlibplot.axes import vlines, hlines

def fixpt(f, x, epsilon=1.0E-4, N=500, store=False):
    y = f(x)
    n = 0
    if store: Values = [(x, y)]
    while abs(y-x) >= epsilon and n < N:
        x = f(x)
        n += 1
        y = f(x)
        if store: Values.append((x, y))
        vlines(x, min(x, y), max(x, y), color='b')
        hlines(y, min(y, x), max(y, x), color='b')
    if store:
        return y, Values
    else:
        if n >= N:
            return "No fixed point for given start value"
        else: 
            return x, n, y

3 个答案:

答案 0 :(得分:1)

def fixedpoint(f,x):
    while x != f(x):
        yield x
        x = f(x)
    yield x

用法:fixedpoint(g,some_starting_value)

垂直和水平条取决于绘图库。指定您使用的是哪一个。

答案 1 :(得分:1)

你的功能看起来很好。我不熟悉vlines和hlines。我使用你的商店arg获取积分,并将它们绘制在函数之外(通常更好地分离这样的问题)。

我只使用matplotlib.pyplot中的plot函数和show函数来显示图形。

from matplotlib import pyplot as plt
import numpy as np

def fixpt(f, x, epsilon=1.0E-4, N=500, store=False):
    y = f(x)
    n = 0
    if store: Values = [(x, y)]
    while abs(y-x) >= epsilon and n < N:
        x = f(x)
        n += 1
        y = f(x)
        if store: Values.append((x, y))
    if store:
        return y, Values
    else:
        if n >= N:
            return "No fixed point for given start value"
        else: 
            return x, n, y

# define f
def f(x):
    return 0.2*x*x

# find fixed point
res, points = fixpt(f, 3, store = True)

# create mesh for plots
xx = np.arange(0, 6, 0.1)

#plot function and identity
plt.plot(xx, f(xx), 'b')
plt.plot(xx, xx, 'r')

# plot lines
for x, y in points:
    plt.plot([x, x], [x, y], 'g')
    plt.plot([x, y], [y, y], 'g')

# show result
plt.show()

答案 2 :(得分:0)

以下是我的想法:

from pylab import *

def f(x):
  return 8*x/(1 + 2*x)

def cobweb(x0, n, ax):
  xs = [x0]
  ys = [0]
  for i in range(1,n):
    if i % 2 == 0:
      xs.append(ys[-1])
      ys.append(ys[-1])
    else:
      xs.append(xs[-1])
      ys.append(f(xs[-1]))
  ax.plot(xs, ys, 'k--', lw=2.0)

x = linspace(0, 4, 100)

fig = figure()
ax  = fig.add_subplot(111)

ax.plot(x, x,    'k', lw=2.0)
ax.plot(x, f(x), 'r', lw=2.0)
cobweb(0.5, 50, ax)

ax.set_xlabel(r'$x$')
ax.set_ylabel(r'$f(x)$')

grid()
show()