# -*- coding: utf-8 -*- """ Created on Wed Dec 17 15:08:08 2014 @author: grivet Listing 5.2: recherche des solutions d'un système de deux équations non linéaires à deux inconnues. Méthode de Newton pour deux variables Variante : à chaque itération, les corrections apportées aux inconnues u et v sont limitées par le facteur alfa. """ import numpy as np import matplotlib.pyplot as plt def f(x,y): return x*x + y*y - 4 def dfdx(x,y): return 2*x def dfdy(x,y): return 2*y def g(x,y): return np.exp(x) + y - 1 def dgdx(x,y): return np.exp(x) def dgdy(x,y): return 1 nc = 4 tol = 1e-4; nitmax = 10; alfa = 0.4 fig = plt.figure() ax = fig.add_subplot(111) xt = np.linspace(-4.0,2.0,30) ax.plot(xt,1.0-np.exp(xt),'-b') xt = np.linspace(-2.0,2.0,50,'-b') ax.plot(xt,np.sqrt(4.0-xt*xt)) ax.plot(xt,-np.sqrt(4.0-xt*xt),'-b') plt.xlim(-4,4); plt.ylim(-3,3) #mise en place des "axes" ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data',0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data',0)) col = ['g','r','k','b'] print("donner les coordonneées de " + str(nc) + " points de départ : ") for j in range(nc): xx = np.zeros(nitmax); yy = np.zeros(nitmax) a = float(input("abscisse initiale: ")) b = float(input("ordonnee initiale: ")) nit = 1 xx[0] = a; x = a yy[0] = b; y = b ax.plot(xx[0],yy[0],'ok') u = 1; v = 1; while ((abs(u) > tol) or (abs(v) > tol)) and nit < nitmax: delta = dfdx(x,y)*dgdy(x,y)-dfdy(x,y)*dgdx(x,y) u = (g(x,y)*dfdy(x,y)-f(x,y)*dgdy(x,y))/delta v = (f(x,y)*dgdx(x,y)-g(x,y)*dfdx(x,y))/delta x = x + alfa*u; y = y + alfa*v xx[nit] = x; yy[nit] = y nit += 1 ax.plot(xx,yy,'o-')