Search code examples
pythonalgorithmmathiterationfixed-point-iteration

Fixed point iteration in Python


Im beginner at Python and I have a problem with this task:

  • Write a function which find roots of user's mathematical function using fixed-point iteration.
  • Use this function to find roots of: x^3 + x - 1.
  • Draw a graph of the dependence of roots approximation by the step number of iteration algorithm.

This is my first time using Python, so I really need help. This is my code, but its not working:

import math
import matplotlib.pyplot as plt
import numpy as np

def fixedp (function, x0, min = 0.001, max = 100):
  i = 0
  e = 1
  xp = []
  while (e > min and i < max):
    x = function(x0)
    e = norm(x0 - x)
    x0 = x
    xp.append(x0)
    i = i + 1
  return x, xp

fx = input("Wrote function : ")
function = lambda x: eval(fx)

x_start = 0.5
xf,xp = fixedp(function, x_start)

x = linspace(0,2,100)
y = function(x)
plot(x, y, xp, function(xp), 'bo', x_start, f(x_start), 'ro', xf, f(xf), 'go', x, x, 'k')
show()

Solution

  • First of all I will note the the logic of your code is great and working. There are some issues with indentation and syntax so I rewrote your code.

    import matplotlib.pyplot as plt
    import numpy as np
    from typing import Tuple, List
    from math import *
    
    
    def iteration(given_function, x0, min_error=0.001, max_iteration=3) -> Tuple[float, List]:
        i = 0
        error = 1
        xp = []
        x = None
        while error > min_error and i < max_iteration:
            x = given_function(x0)
            error = abs(x0 - x)
            x0 = x
            xp.append(x0)
            i += 1
        print(xp)
        return x, xp
    
    
    def plot(xf, xp, x_start, given_function):
        function_v = np.vectorize(given_function)
    
        x = np.linspace(0, 2, 100)
        y = function_v(x)
        plt.plot(x, y)
        plt.plot(xp, function_v(xp), 'bo')
        plt.plot(x_start, given_function(x_start), 'ro')
        plt.plot(xf, given_function(xf), 'go')
        plt.plot(x, x, 'k')
        plt.show()
    
    
    def main():
        fx = input("Write function: ")
        given_function = lambda x: eval(fx)
    
        x_start = 0.9
        xf, xp = iteration(given_function, x_start)
    
        plot(xf, xp, x_start, given_function)
    
    
    if __name__ == '__main__':
        main()
    

    Good luck with Python in the future!