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

Private GIT Repository
ajout de partiels
[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):
20         return f(xn) != 0 and abs(xnm1-xn) > epsilon  
21     xnm1 = a 
22     xn= a
23     X=[]
24     n = 1
25     an= a
26     bn=b
27     test = True
28     while n <= m and test:
29         xnm1 = xn
30         xn=float(an+bn)/2
31         test = maj_test(xn,xnm1)
32         X +=[xn]
33         if f(an)*f(xn)<=0 : 
34             bn=xn
35         else :
36             an=xn
37         n +=1
38     return (n,X)
39
40 def  iteration_newton(x0,m,epsilon,f,fp):
41     def maj_test(xn,xnm1):
42         return f(xn) != 0 and abs(xnm1-xn) > epsilon  
43     n=0;
44     test= f(x0) != 0
45     xn=x0
46     X=[x0]
47     while n < m and 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)
54
55 #f(x) !=0 and n<m  and abs(x-xm1)>epsilon
56     return (n,X)
57
58
59 def  iteration_corde(a,b,x0,m,epsilon,f):
60     def maj_test(xn,xnm1):
61         return f(xn) != 0 and abs(xnm1-xn) > epsilon  
62     n=0;
63     q=float(f(b)-f(a))/(b-a)
64     test= f(x0) != 0
65     xn=x0
66     X=[x0]
67     while n < m and test:
68         xnm1=xn
69         xn= xn-f(xn)/q
70         X += [xn]
71         n=n+1
72         test= maj_test(xn,xnm1)
73
74 #f(x) !=0 and n<m  and abs(x-xm1)>epsilon
75     return (n,X)
76
77 """def  iteration_newton(x0,m,epsilon,f,fp):
78     n=0;
79     delta=float(1)/fp(x0)
80     test= f(x0) != 0
81     x=x0
82     X=[x0]
83     while(test):
84         xm1=x
85         x= x-delta*f(x)
86         delta=float(1)/fp(x)
87         X += [x]
88         n=n+1
89         test= not (f(x)==0 or n>=m  or abs(x-xm1)<=epsilon)
90     return (n,X)
91 """
92
93 def  iteration_lagrange(x0,x1,m,epsilon,f):
94     n=0;
95     delta=float(x1-x0)/(f(x1)-f(x0))
96     test= f(x0) != 0
97     x=x1
98     X=[x1]
99     while(test):
100         xm1=x
101         x= x-delta*f(x)
102         delta=float(x-xm1)/(f(x)-f(xm1))
103         X += [x]
104         n=n+1
105         test= not (f(x)==0 or n>=m  or abs(x-xm1)<=epsilon)
106     return (n,X)
107
108 def  iteration_muller(x0,x1,x2,m,epsilon,f):
109     def maj_test(xn,xnm1):
110         return f(xn) != 0 and abs(xnm1-xn) > epsilon  
111     n=0;
112     test= f(x2) != 0
113     xn=x2
114     xnm1 = x1
115     xnm2 = x0
116     X=[x0,x1]
117     while n < m and test:
118         # calcul des coefs an, bn et cn 
119         an = float(f(xn))/((xn-xnm1)*(xn-xnm2))+float(f(xnm1))/((xnm1-xn)*(xnm1-xnm2))+float(f(xnm2))/((xnm2-xn)*(xnm2-xnm1))
120         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))
121         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))
122
123         dn = bn*bn - 4*an*cn
124         xnp = float(-bn - sqrt(dn))/(2*an)        
125         xnpp = float(-bn + sqrt(dn))/(2*an)        
126         xnp1 = xnp if abs(xnp-xn)<abs(xnpp-xn) else xnpp
127         X += [xn]
128         xnm2 = xnm1
129         xnm1 = xn
130         xn = xnp1
131         test= maj_test(xn,xnm1)
132         n +=1
133 #f(x) !=0 and n<m  and abs(x-xm1)>epsilon
134     return (n,X)
135
136
137
138
139 def main():
140     print "TP 3.1 ............ dichotomie"
141     print iteration_dichotomie(0,pi/2,200,0.00000001,f)
142
143     
144     print "TP 3.1 ............ corde"
145     print iteration_corde(0,pi/2,0,200,0.00000001,f)
146
147
148     print "TP 3.1 ............ newton"
149     print iteration_newton(0,200,0.00000001,f,fp)
150
151
152     print "TP 3.1 ............ lagrange"
153     print iteration_lagrange(0,pi/2,200,0.00000001,f)
154
155     print "TP 3.1 ............ muller"
156     print iteration_muller(0,pi/4,pi/2,200,0.00000001,f)
157     
158
159 if __name__ == '__main__':
160     main()
161