2011-04-06 74 views
0

給定一個函數g(x),我想使用 fixed point iteration找到這個函數的一個固定點。除了找到點本身之外,我想使用matplotlib.pyplot將圖形繪製到函數中,並且包括顯示迭代如何在固定點(如果存在)上關閉的垂直和水平條。 Example picturePython中的定點迭代和繪圖

所有幫助表示感謝! /編程新手

編輯:由於我沒有太舒服發電機對象還沒有,我已經寫了下面的代碼。但它並不完全正確:它有什麼問題?

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 

回答

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

用法:fixedpoint(g,some_starting_value)

垂直和水平線條取決於繪圖庫。指定您使用的是哪一個。

+0

matplotlib。謝謝! – Vandar 2011-04-06 19:30:16

1

你的功能看起來不錯。我不熟悉vlines和hlines。我用你的arg來獲得積分,並將它們繪製在函數之外(通常最好將這些問題分開)。

我只使用matplotlib.pyplot的繪圖函數和顯示圖形的顯示函數。

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