1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| %script qui permet de résoudre numériquement une équation du type
% f(x)=0 sur un intervalle [a,b]
% Attention on suppose que f ne s'annule qu'une seule fois
% sur [a,b]
% on se fixe une précision epsi pour calculer le zero
% Attention pour éviter de lancer une boucle infinie
% on fixe arbitrairement le nombre max d'itérations
% nb d it max
imax = 10;
% epsi precision recherchee
epsi = 1/100; %
epsilon=10^(-14);
% compteur de boucle
I=0;
%Intervalle [a,b]
a=-pi;
b=5*pi;
sol=zeros(0,10);
% sert a stocker les resultats numeriques
c=0;
c1=0;
c=a
% fun() est une fonction du type f(x)
% c'est celle dont on cherche le zéro
% Principe : on divise [a,b] en deux
% on regarde de quel côté est le zéro
% (on teste si le signe change ou pas)
% On se place sur le nouvel intervalle
% et on recommence.
for ip=1,10
while (I < imax)
c=(c+b)/2 % c milieu de [a,b]
% if (fun(a)*fun(b))
if(abs(sin(a)*sin(b))<=epsilon)
if (abs(sin(a))<=epsilon)
c1=a;
elseif (abs(sin(b))<=epsilon)
c1=b;
end
end
% c=c1;
% Ici il faut creer un tableau afin de stocker les valeurs qu'on trouve
% soit les "c" ou "c1" car on doit faire une petite boucle pour j de
% 1,10 avec les deux premieres valeurs v(0)=0 ; et v(1)=a+b/2
% il faut faire une petite boucle qui donne c après on fait v(j)=c et refaire une autre
% boucle plus grande qui qui renvoie le nouveau c pour les calcules et
% nous donne un c=v(j)
% if (fun(a)*fun(c) <= 0) % si il y a un changement de signe
if(sin(a)*sin(b)<=epsilon) %le zéro est compris entre a et c
else
a=c; % le zéro est compris entre c et b
end
% if (abs(fun(c))<= epsi)
if (abs (sin(c))<=epsi)
sprintf 'ok'
break;
elseif (I == imax-1)
sprintf 'pas ok'
break;
end
I = I +1;
end
'nombre d iterations'
I+1
'resultat'
c
sol(ip)=c
end
sol |