function Equa_RK4_Tir(n,epsilon,niter) ############################################################# # # Resolution de l'equation -u''(x) =sin(pi*x) sur l'intervalle [0;1] # u(0)=u(1)=0 # selon la methode de Runge-kutta d'ordre 4 couplee a la methode de tir # u1'(x)=u2(x) # u2'(x)=-sin(pi*x) # # conditions initiales # u1(0)=0 # u2(0)=u1'(0)=a #------------------------------------------------------------------------------------ # Arguments d'entree: # n= nombre d'intervalles # epsilon= tolerance # niter= nombre maximale de tirs ############################################################# # Auteur: Ambroise Brou # Fev 2007 ############################################################# format long # travail en double precision x0=0; # abscisse initiale x1=1; # abscisse finale a0=0.2; # valeur initiale de u'(0) u1=0; # valeur de u(x) quand x=1 x = [x0:1/(n+1):x1]'; # vecteur contenant les abscisses x erreur=1e10; # erreur initiale tol=epsilon; # tolerance iter=1; # initialisation du compteur d'iterations iter_max=niter; # on fixe le nombre maximal d'iterations while (abs(erreur)>tol & itertol) a2=1.5*a0; # on fixe une seconde valeur pour a et on resoud le systeme u0=[0 a2]'; [x,u]=rk4_Equa_octave(x0,x1,n,u0); [l c]=size(u); beta2=u(1,c); a_new=a1+(u1-beta1)*(a2-a1)/(beta2-beta1); # calcul de la nouvelle valeur de a iter=iter+1; # mise a jour du compteur d'iteration a0=a_new; # mise a jour de la valeur de a0 endif endwhile # représentation graphique hold off; plot(x,u(1,:),"-1*;Runge-Kutta;"); hold on; grid on; x=x'; u=u(1,:)'; y=sin(pi*x)/pi^2; plot(x,y,"-3+;Solution exacte;"); xlabel('x'); ylabel('u(x)'); e=abs(u-y); # valeur absolue de l'erreur printf(" x Sol exacte Runge-Kutta erreur\n"); for i=1: length(x) printf("%10.6f %10.6f %10.6f %10.2e\n",x(i),y(i),u(i),e(i)); endfor; endfunction