Python中的不动点迭代与绘图
给定一个函数 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)
。
竖线和横线的样式取决于你使用的绘图库。记得说明你用的是哪个库。