]> AND Private Git Repository - cours-mesi.git/blob - tps/chap3/methodes.py
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
j
[cours-mesi.git] / tps / chap3 / methodes.py
1 import matplotlib.pyplot as plt
2 import numpy as np
3 from math import *
4
5
6
7
8
9 def f(x):
10     return cos(x)-x
11
12 def fp(x):
13     return -sin(x)-1
14
15
16
17
18 def  iteration_dichotomie(a,b,m,epsilon,f):
19     def maj_test(xn,xnm1,n,m):
20         return f(xn) == 0 or abs(xnm1-xn) <= epsilon or n >= m    
21     xn= float(a)
22     xnm1 =float(b) 
23     X=[]
24     n = 0
25     an= float(a)
26     bn=float(b)
27     test = maj_test(xn,xnm1,n,m)
28     while not test:
29         xnm1 = xn
30         xn=float(an+bn)/2
31         X +=[xn]
32         if f(an)*f(xn)<=0 : 
33             bn=xn
34         else :
35             an=xn
36         n +=1
37         test = maj_test(xn,xnm1,n,m)
38     return (n,X)
39
40 def  iteration_newton(x0,m,epsilon,f,fp):
41     def maj_test(xn,xnm1,epsilon,n,m,f):
42         return f(xn) == 0 or abs(xnm1-xn) <= epsilon or n >= m
43     n = 0
44     xn = float(x0)
45     X = [x0]
46     test = maj_test(xn,xn+2*epsilon,epsilon,n,m,f)
47     while not test:
48         qn=fp(xn)
49         xnm1=xn
50         xn= xn-f(xn)/qn
51         X += [xn]
52         n=n+1
53         test= maj_test(xn,xnm1,epsilon,n,m,f)
54     return (n,X)
55
56
57 def  iteration_corde(a,b,x0,m,epsilon,f):
58     def maj_test(xn,xnm1,n,m,f):
59         return f(xn)== 0 or abs(xnm1-xn) <= epsilon or n >= m
60     n=0
61     q=float(f(b)-f(a))/(b-a)
62     xnm1 = float(b)
63     xn=float(x0)
64     test= maj_test(xn,xnm1,n,m,f)
65     X=[float(x0)]
66     while not test:
67         xnm1=xn
68         xn= xn-float(f(xn))/q
69         X += [xn]
70         n=n+1
71         test= maj_test(xn,xnm1,n,m,f)
72     return (n,X)
73
74
75 def  iteration_lagrange(x0,x1,m,epsilon,f):
76     n=0;
77     delta=float(x1-x0)/(f(x1)-f(x0))
78     test= f(x0) != 0
79     x=x1
80     X=[x1]
81     while(test):
82         xm1=x
83         x= x-delta*f(x)
84         delta=float(x-xm1)/(f(x)-f(xm1))
85         X += [x]
86         n=n+1
87         test= not (f(x)==0 or n>=m  or abs(x-xm1)<=epsilon)
88     return (n,X)
89
90 def  iteration_muller(x0,x1,x2,m,epsilon,f):
91     def maj_test(xn,xnm1):
92         return f(xn) != 0 and abs(xnm1-xn) > epsilon  
93     n=0;
94     test= f(x2) != 0
95     xn=x2
96     xnm1 = x1
97     xnm2 = x0
98     X=[x0,x1]
99     while n < m and test:
100         # calcul des coefs an, bn et cn 
101         an = float(f(xn))/((xn-xnm1)*(xn-xnm2))+float(f(xnm1))/((xnm1-xn)*(xnm1-xnm2))+float(f(xnm2))/((xnm2-xn)*(xnm2-xnm1))
102         bn = -float(f(xn)*(xnm1+xnm2))/((xn-xnm1)*(xn-xnm2))-float(f(xnm1)*(xn+xnm2))/((xnm1-xn)*(xnm1-xnm2))-float(f(xnm2)*(xn+xnm1))/((xnm2-xn)*(xnm2-xnm1))
103         cn = float(f(xn)*xnm1*xnm2)/((xn-xnm1)*(xn-xnm2))+float(f(xnm1)*xn*xnm2)/((xnm1-xn)*(xnm1-xnm2))+float(f(xnm2)*xn*xnm1)/((xnm2-xn)*(xnm2-xnm1))
104
105         dn = bn*bn - 4*an*cn
106         xnp = float(-bn - sqrt(dn))/(2*an)        
107         xnpp = float(-bn + sqrt(dn))/(2*an)        
108         xnp1 = xnp if abs(xnp-xn)<abs(xnpp-xn) else xnpp
109         X += [xn]
110         xnm2 = xnm1
111         xnm1 = xn
112         xn = xnp1
113         test= maj_test(xn,xnm1)
114         n +=1
115 #f(x) !=0 and n<m  and abs(x-xm1)>epsilon
116     return (n,X)
117
118
119
120
121 def main():
122     print "TP 3.1 ............ dichotomie"
123     print iteration_dichotomie(0,pi/2,45,1E-9,f)
124
125     print "TP 3.1 ............ corde"
126     print iteration_corde(0,pi/2,0,200,1E-9,f)
127
128     print "TP 3.1 ............ newton"
129     print iteration_newton(0,200,1E-9,f,fp)
130
131
132
133 """
134     print "TP 3.1 ............ lagrange"
135     print iteration_lagrange(0,pi/2,200,0.00000001,f)
136
137     print "TP 3.1 ............ muller"
138     print iteration_muller(0,pi/4,pi/2,200,0.00000001,f)
139     
140 """
141 if __name__ == '__main__':
142     main()
143