Python中的不动点迭代与绘图

0 投票
3 回答
5843 浏览
提问于 2025-04-16 15:13

给定一个函数 g(x),我想用 固定点迭代法 来找到这个函数的一个固定点。除了找到这个点之外,我还想用 matplotlib.pyplot 来绘制这个函数的图像,并加上垂直和水平的线条,显示迭代是如何逐渐接近固定点的(如果存在的话)。 示例图片

非常感谢大家的帮助!

编辑:因为我对生成器对象还不太熟悉,所以我写了以下代码。不过它似乎不太好用:这段代码有什么问题吗?

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

这是我思考的过程:

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

你的函数看起来没问题。我对vlines和hlines不太了解。我用了你的store参数来获取点,然后在函数外面绘制它们(通常把问题分开处理会更好)。

我只用了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
def fixedpoint(f,x):
    while x != f(x):
        yield x
        x = f(x)
    yield x

用法:fixedpoint(g,some_starting_value)

竖线和横线的样式取决于你使用的绘图库。记得说明你用的是哪个库。

撰写回答