next up previous   
Next: Formule di quadratura Up:Introduzione  Previous: Interpolazione di funzioni
Intro Gen: Introduzione Generale  Home: Home page

Zero.m

% CALCOLO DELLO ZERO DI UNA FUNZIONE

 

help zero;

disp('Scegliere tra i seguenti metodi di calcolo dello zero di una funzione: ');

q=0;

while q==0

   clear;

   q=0;

   err=0;

   while err==0

         disp('1. Metodo di bisezione');

         disp('2. Metodo di Newton-Rapson');

         disp('3. Metodo delle secanti a due punti');

disp('4. Metodo di Newton a doppio passo per il calcolo di tutti gli zeri reali di un generico polinomio');

         s=input('Introduci il numero corrispondente : ');

         if s~=1 & s~=2 & s~=3 & s~=4

            disp('Scelta errata');

            disp('Ricomincia');

         else

            err=1;

         end

   end

   if s~=4

      disp('INTRODUCI:');

      err=0;

      while err==0

            F=input('- Il nome della function contenente la funzione : ','s');

            if exist(F)==0

               disp('La funzione non esiste, introduci :');

            else

               err=1;

            end

      end

      e=input('- L''errore massimo che si può commettere (massimo 0.1) : ');

      err=0;

      while err==0

         if e>0.1 | e<=0

            disp(' Il valore dell''errore massimo introdotto non é corretto');

            e=input('Introducilo nuovamente : ');

         else

            err=1;

         end 

      end

   end

   if s==1

       

% METODO DI BISEZIONE

       

      a=input('- L''estremo inferiore dell''intervallo : ');

      b=input('- L''estremo superiore dell''intervallo tale che f(a)*f(b)<0 : ');

      if a>=b

         disp('L''estremo inferiore deve essere strettamente minore di quello superiore');

         disp('Ricomincia dall''inizio .');

         disp('Scegli nuovamente il metodo di calcolo : ');

      else

       w1=feval(F,a);

       w2=feval(F,b);

       if w1*w2>0

         disp('Il metodo non è applicabile .');

         disp('Infatti agli estremi la funzione assume lo stesso segno.');

         disp('Scegli un altro metodo :');

       else if w1==0

              disp('Lo zero è : ');

              c=a;

              g=0;

           else if w2==0

                   disp('Lo zero è : ');

                   c=b;

                   g=0;

                else

                   k=(log((b-a)/e))/log(2);

                   bk=b;

                   ak=a;

                   k=ceil(k);

                   i=1;

                   while i<=k

                         c=(ak+bk)/2;

                         g=feval(F,c);

                         if g==0

                            disp('Lo zero é : ');

                            i=k;

                         else

                            w=feval(F,ak);

                            if g*w>0

                               ak=c;

                            else bk=c;

                            end

                         end

                         i=i+1;

                     end

                end

                while g>e

                 c=(ak+bk)/2;

                 g=feval(F,c);

                 if g==0

                    disp('Lo zero é : ');

                    c

                 else

                    w=feval(F,ak);

                    if g*w>0

                       ak=c;

                    else bk=c;

                    end

                 end

                end

           end

           if g~=0

              disp('Lo zero é approssivamente: ');

           end

           disp(c);

           q=1;

       end

      end

   end 

   if s==2

            

% METODO DI NEWTON-RAPSON

      err=0;

      while err==0

          G=input('- Il nome della function contenente la derivata prima della funzione : ','s');

          if exist(G)==0

             disp('La funzione non esiste, introduci :');

          else

             err=1;

          end

      end

      x0=input('- L''approssimazione iniziale dello zero da calcolare : ');

      i=1;

      g=feval(F,x0);

      if g==0

         disp('Lo zero é : ');

         x1=x0;

         i=2;

         w=1;

      else

         w=feval(G,x0);

         if w==0

            disp('Metodo non applicabile');

            disp('Infatti si annulla la derivata prima della funzione in esame.');

            disp('Scegli un altro metodo o cambia l''approssimazione iniziale :');

            i=2;

         else

            x1=x0-(g/w);

         end

      end

      while i==1 & (abs(x1-x0)>=e | abs(g)>=e)

            x0=x1;

            g=feval(F,x0);

            if g==0

               disp('Lo zero é : ');

               i=2;

            else

               w=feval(G,x0);

               if w==0

                  disp('Metodo non applicabile');

                  disp('Infatti si annulla la derivata prima della funzione in esame.');

                  disp('Scegli un altro metodo o cambia l''approssimazione iniziale :');

                  i=2;

               else

                  x1=x0-(g/w);

               end    

            end

      end

      if w~=0

         if g~=0

            disp('Lo zero é approssivamente: ');

         end

         q=1;

         x0

      end

   end

   if s==3

                 

% METODO DELLE SECANTI A DUE PUNTI

               

      dom=0;

      while dom==0

            x0=input('- La prima approssimazione iniziale dello zero da calcolare : ');

            x1=input('- La seconda approssimazione iniziale dello zero da calcolare : ');

            if x0==x1

               disp('I due punti devono essere differenti.Ricomincia');

               disp('Introduci nuovamente : ');

            else

               b=feval(F,x0);

               c=feval(F,x1);

               if b==0

                  disp('Lo zero é :');

                  b

                  q=1;

               else

                  i=1;

                  while i==1 & (abs(x1-x0)>e | abs(c)>e)

                        if c==b

                           disp('Metodo non applicabile');

                           disp('Scegline un altro oppure cambia i dati iniziali:');

                           i=2;

                        else

                           q=1;

                           if c==0

                              disp('Lo zero é :');

                              i=2;

                              x2=c;

                           else

                              x2=x1-c*((x1-x0)/(c-b));

                              b=c;

                              x0=x1;

                              x1=x2;

                              c=feval(F,x1);

                           end

                        end    

                  end 

                  if q==1

                     if c~=0

                        disp('Lo zero é approssivamente: ');

                     end

                     disp(x2);

                  end

               end

               dom=1;

            end

      end  

   end

   if s==4

 

% METODO DI NEWTON A DOPPIO PASSO

 

      disp('Scegli tra :');

      err=0;

      while err==0

            disp('1. - Introdurre a priori il numero di zeri reali del polinomio interessato');

            disp('2. - Applicare altri metodi ');

            pr=input('Introduci il numero corrispondente : ');

            if pr~=1 & pr~=2

               disp('Scelta errata');

               disp('Ricomincia');

            else

               err=1;

            end

      end

      if pr==1

         disp('Introduci :');

         disp('- il vettore dei coefficienti del polinomio a partire dal termine');

         vett=input('  noto fino ad arrivare a quello di grado massimo : ');

         err=0;

         err1=0;

         while err==0

               [o,h]=size(vett);

               if o~=1 & h~=1

                  vett=input('  Non é stato introdotto un vettore.Inseriscilo : ');

                  err1=1;

               else

                  if o==1 & h==1

                     vett=input('  Il vettore deve avere almeno 2 elementi.Inseriscili : ');

                     err1=1;

                  else

                     [o,h]=size(vett);

                     if o==1

                        vett=vett';

                        o=h;

                     end

                     j=o;

                     while j>0

                        if vett(j)==0                               % controllo dell'effettivo

                           vett=vett(1:j-1);                          % grado del polinomio

                        else

                           j=0;

                        end

                           j=j-1;

                     end

                     [o,h]=size(vett);

                     if o==0

                        vett=input('  E''stato introdotto un vettore nullo.Inseriscilo nuovamente : ');

                        err1=1;

                     else 

                        err=1;

                     end

                  end

               end

         end

         if err1==1

            disp('Introduci :');

         end

         disp('- il numero di zeri reali del polinomio (nel caso di polinomi di secondo grado');

         num=input('  verranno calcolati tutti gli zeri compreso quelli complessi) : ');

         err=0;

         err1=0;

         while err==0     

               if num<0 | round(num)~=num

                  num=input('  Valore errato.Inserisci quello giusto : ');

                  err1=1;

               else

                  if num>o-1

                     disp('  il numero di zeri non può superare il grado del polinomio'); 

                     num=input('  Inserisci quello giusto : '); 

                     err1=1;    

                  else         

                     err=1;

                  end

               end

         end

         if err1==1

            disp('Introduci :');

         end

         g=input('- l''errore massimo di approssimazione (al massimo 0.1): ');

         err=0;

         while err==0

               if g>0.1 | g<=0

                  g=input('  Valore errato.Inserisci quello giusto : ');

               else

                  err=1;

               end 

         end

         if o==1

            disp('Il polinomio introdotto ha grado zero');

         else

            if num==0

              disp('Il polinomio non ha zeri reali');

            else

              [b,risp,dom]=zerpol(vett,num,g);

              if risp==0

                disp('Gli zeri del polinomio sono : ');

                disp(b);

                if dom==1

                   disp('OSS.:in questo caso é stato possibile calcolare anche gli zeri complessi');

                end

              else

                disp('Metodo non applicabile in questo caso');

              end

            end

         end

         q=1;

      end

   end

   if q==1

      fine=input('Se vuoi ricominciare nuovamente premi il tasto ''1'' :');

      if fine==1

         q=0;

         disp('Scegli di nuovo tra :');

      end

   end

end  


next up previous   
Next: Formule di quadratura Up:Introduzione  Previous: Interpolazione di funzioni
Intro Gen: Introduzione Generale  Home: Home page
Vito Marinelli
8-5-2000

HyperCounter
BPath Contatore