next up previous contents
Next: Macsyma Up: FUNCIONES DE DOBLE PERIODO Previous: Conclusiones

Programa en C

/*
   UNIVERSIDAD AUTONOMA DE PUEBLA
       COLEGIO DE COMPUTACION
        ANALISIS NUMERICO II
*/

#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include "plotp.h"
#include "arcom.c"

#define NF  	29
#define NC  	29

complex inc, z0;
double XMI, XMA, IMI, IMA, DMIx, DMAx, DMIi, DMAi, N, NDIVX, NDIVI;

 void ejesri()
 { pltig( XMI, IMI, 1, pltca);
   pltig( XMA, IMA, 2, pltca);
   pltig( XMI, 0.0, 3, pltca);
   pltig( XMA, 0.0, 8, pltca);
   pltig( 0.0, IMI, 3, pltca);
   pltig( 0.0, IMA, 9, pltca);
   return;  }

complex func(z) complex z; {                            /*  Calculo de la funci\'on   */
complex fz={0.0,0.0},caux,ca={1.0,0.0},com;
com.x=DMIx;  com.i=DMIi;
  for(com.x=DMIx; com.x<=DMAx; com.x+=inc.x)
    for(com.i=DMIi; com.i<=DMAi; com.i+=inc.i) {
      caux=dfnc(dfnc(z,com),z0);
      fz=adnc(fz,divnc(ca,mulnc(caux,caux))); };
/*  return(divnc(ca,fz)); */                             /* 1/f(z)                     */
  return(fz);                                            /* f(z)                       */
com.x=1; com.i=1;
/*return(mulnc(fz, mulnc(dfnc(z, com),dfnc(z, com))));*/ /*factorizando el polo        */
/*return(mulnc(fz, dfnc(z, com)));                    */ /*factorizando un orden del polo*/
/*com.x=0.5; com.i=0.5;
  return(divnc(fz, mulnc(dfnc(z,com), dfnc(z,com))));*/ /* factoriznado un cero      */
/*return(divnc(fz, dfnc(z,com)));	             */ /*factorizando un orden del cero*/
  }


double acota(double n)
{
  if (n>N) return (N);
  else if( n<-N ) return (-N);
  return (n);
}

void main()
{ int i,j,decis;
  complex aux;
  double mfdp[NC][NF], mcf[NC][NF];
  double dx,di,zmi,zma,x,ic,dz;
  double micx, macx, mici, maci, smicx, smacx, smici, smaci, sdct;

printf("Proporcionar XMI, XMA, IMI, IMA, z0 :   ");
scanf("%lf %lf %lf %lf %lf %lf", &XMI, &XMA, &IMI, &IMA, &z0.x, &z0.i);
printf("Proporcionar Cota, NDIVX, NDIVI, DMIx, DMAx, DMIi, DMAi: ");
scanf("%lf %lf %lf %lf %lf %lf %lf", &N, &NDIVX, &NDIVI, &DMIx, &DMAx, &DMIi, &DMAi);

printf("Rango de primer corte :  ");
scanf("%lf %lf %lf %lf", &micx, &macx, &mici, &maci);

printf("Rango de segundo corte :  ");
scanf("%lf %lf %lf %lf", &smicx, &smacx, &smici, &smaci);

inc.x=(DMAx-DMIx)/(NDIVX); inc.i=(DMAi-DMIi)/(NDIVI);
  dx=fabs(XMA-XMI)/(double)(NF-1);
  di=fabs(IMA-IMI)/(double)(NC-1);
  zmi=acota(modnc(func(XMI,IMI)));
  zmi=(zmi<0.0) ? 0.0 : zmi;
  zma = zmi;

  sdct=N/4;

  ic = IMI;
  for(i=0; i<NC; i+=1)
  {
    x = XMI;
    for(j=0; j<NF; j+=1) {
    if((micx<=x && x<=macx) && (mici<=ic && ic<=maci)) {   /*Para primer corte        */
      mfdp[i][j]=-1;
      x+=dx;
      continue;  };
    aux=arg_mod(func(x,ic));
    mcf[i][j]=aux.i;
    aux.x=x;   aux.i=ic;
    aux.x=acota(modnc(func(aux)));
    if((smicx<=x&&x<smacx) && (smici<=ic&&ic<smaci))       /*Para segundo corte       */
      mfdp[i][j] = (aux.x>sdct)?sdct:aux.x;
    else
      mfdp[i][j] = aux.x;

    if (mfdp[i][j] < zmi) zmi=mfdp[i][j];
    if (mfdp[i][j] > zma) zma=mfdp[i][j];
    x+=dx;   }
    ic+=di;
   }

if(toupper(decis)=='S')  {
for(i=0;i<NC;i+=NC-1)                                      /*Para los bordes          */
  for(j=0;j<NF;mfdp[i][j++]=zmi);
for(j=0;j<NF;j+=NF-1)
  for(i=0;i<NC;mfdp[i++][j]=zmi);  }

for(i=0;i<NC;i++)                                          /*Para primer corte        */
  for(j=0;j<NF;j++) {
    if(mfdp[i][j]!=-1)
      continue;
    mfdp[i][j]=zmi;  };

   dz = fabs(zma-zmi)/8.0;
   x = zmi - dz;
   i = zma + dz;

decis = 'a';
while(decis != 'X') {
printf("\n\t-S- Superficie\n\t-F- cont. Fase\n\t-2- 2contorno\n\t-C- Contorno");
decis=toupper(getche());
   pltdk(3);
   plt00();
   plotf(-1);
   pltfr(3);
   pltso(3.0, 3.0, 0.0, 0.0);
   switch (decis) {
     case 'C':
          ejesri();
          pltcolor(14);                                /*  YELLOW                    */
          pltkp(zmi,&mfdp[0][0],(zma-zmi)/150,25,(NF/64)+1,NF,(NC/64)+1,NC,pltca);
          pltcolor(8);                                 /*  DARKGRAY                  */
          pltkp((zma-zmi)/150,&mfdp[0][0],(zma-zmi)/2,25,(NF/64)+1,NF,(NC/64)+1,NC,pltca);
          pltcolor(9);                                 /* BROWN                      */
          pltkp((zma-zmi)/2,&mfdp[0][0],2*(zma-zmi)/3,25,(NF/64)+1,NF,(NC/64)+1,NC,pltca);
          pltcolor(1 | 0);                             /* BLUE | BLACK               */
          pltkp(2*(zma-zmi)/3,&mfdp[0][0],zma,25,(NF/64)+1,NF,(NC/64)+1,NC,pltca);
	       
            /* Para graficar la red de periodos  */
          pltcolor(4);                                 /* RED                        */
          DMAx=(DMAx>XMA)?DMAx:XMA;
          DMAi=(DMAi>IMA)?DMAi:IMA;
          DMIx=(DMIx<XMI)?DMIx:XMI;
          DMIi=(DMIi<IMI)?DMIi:IMI;
          for(dx=DMIx+(inc.x/2); dx<=DMAx; dx+=inc.x)  {
            pltig(dx,DMIi, 3, pltca);
            pltig(dx,DMAi, 4, pltca);         }
          for(di=DMIi+(inc.x/2); di<=DMAi; di+=inc.i)  {
            pltig(DMIx, di, 3, pltca);
	    pltig(DMAi, di, 4, pltca);        }
            pltcolor(11);
	    ejesri();
            break;
     case 'F': 
          ejesri();
          pltkc(zmi,&mcf[0][0],zma,25,(NF/64)+1,NF,(NC/64)+1,NC,pltca);
          break;
     case '2': 
          ejesri();
	  pltcolor(14);                                /* YELLOW                     */
          pltkp(zmi,&mfdp[0][0],(zma-zmi)/150,25,(NF/64)+1,NF,(NC/64)+1,NC,pltca);
          pltcolor(8);                                 /* DARKGRAY                   */
          pltkp((zma-zmi)/150,&mfdp[0][0],(zma-zmi)/2,25,(NF/64)+1,NF,(NC/64)+1,NC,pltca);
	  pltcolor(9);                                 /* BROWN                      */
          pltkp((zma-zmi)/2,&mfdp[0][0],2*(zma-zmi)/3,25,(NF/64)+1,NF,(NC/64)+1,NC,pltca);
	  pltcolor(1 | 0);                             /* BLUE | BLACK               */
          pltkp(2*(zma-zmi)/3,&mfdp[0][0],zma,25,(NF/64)+1,NF,(NC/64)+1,NC,pltca);
          pltcolor(2);                                 /* GREEN                      */
	  pltkc(zmi,&mcf[0][0],zma,25,(NF/64)+1,NF,(NC/64)+1,NC,pltca);
	  pltcolor(11);
	  ejesri();
	  break;
     case 'S': 
          for(i=0;i<NC;i+=NC-1)                        /* Para los bordes            */
	     for(j=0;j<NF;mfdp[i][j++]=zmi);
	     for(j=0;j<NF;j+=NF-1)
		for(i=0;i<NC;mfdp[i++][j]=zmi);
          pltrv(x,&mfdp[0][0], i, NF, NC, -40.0, pltca);
          break;
     case 'X': 
          exit(0);
     default : 
          printf("No detecto");
          break;  };

   getchar();
   pltcolor(2);  
   plotr();
   pltla(" fndp ",6);
   pltho();
   closeplt(); }
   }


Microcomputadoras
2001-03-09