Main Page   Data Structures   File List   Data Fields   Globals  

poly.c

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <math.h>
00003 #include "xfig.h"
00004 
00005 
00006 #define QUAD(x) ((x)*(x)*(x)*(x))
00007 #define CUBE(x) ((x)*(x)*(x))
00008 #define SQ(x) ((x)*(x))
00009 
00010 #define N 10
00011 #define XMIN 0
00012 #define XMAX 3
00013 #define YMIN 0
00014 #define YMAX 3
00015 
00016 #define OK(i,j) (!(i == 0 && j == 0) && !(i == 1 && j == 0) && !(i == 0 && j == 1) && \
00017                  !(i == 3 && j == 0) && !(i == 3 && j == 1) && !(i == 3 && j == 3))
00018 
00019 
00020 void ludcmp(double a[N+1][N+1], int indx[], double *d)
00021 {
00022   int i,imax,j,k;
00023   double big,dum,sum,temp;
00024   double vv[N+1];
00025   
00026   *d=1.0;
00027   for (i=1;i<=N;i++) {
00028     big=0.0;
00029     for (j=1;j<=N;j++)
00030       if ((temp=fabs(a[i][j])) > big) big=temp;
00031     if (big == 0.0) {
00032       fprintf(stderr, "Singular matrix in routine ludcmp\n");
00033       exit(1);
00034     }
00035     vv[i]=1.0/big;
00036   }
00037   for (j=1;j<=N;j++) {
00038     for (i=1;i<j;i++) {
00039       sum=a[i][j];
00040       for (k=1;k<i;k++) sum -= a[i][k]*a[k][j];
00041       a[i][j]=sum;
00042     }
00043     big=0.0;
00044     for (i=j;i<=N;i++) {
00045       sum=a[i][j];
00046       for (k=1;k<j;k++)
00047         sum -= a[i][k]*a[k][j];
00048       a[i][j]=sum;
00049       if ( (dum=vv[i]*fabs(sum)) >= big) {
00050         big=dum;
00051         imax=i;
00052       }
00053     }
00054     if (j != imax) {
00055       for (k=1;k<=N;k++) {
00056         dum=a[imax][k];
00057         a[imax][k]=a[j][k];
00058         a[j][k]=dum;
00059       }
00060       *d = -(*d);
00061       vv[imax]=vv[j];
00062     }
00063     indx[j]=imax;
00064     if (a[j][j] == 0.0) a[j][j]=1e-30;
00065     if (j != N) {
00066       dum=1.0/(a[j][j]);
00067       for (i=j+1;i<=N;i++) a[i][j] *= dum;
00068     }
00069   }
00070 }
00071 
00072 
00073 void lubksb(double a[N+1][N+1], int indx[], double b[])
00074 {
00075   int i,ii=0,ip,j;
00076   double sum;
00077   
00078   for (i=1;i<=N;i++) {
00079     ip=indx[i];
00080     sum=b[ip];
00081     b[ip]=b[i];
00082     if (ii)
00083       for (j=ii;j<=i-1;j++) sum -= a[i][j]*b[j];
00084     else if (sum) ii=i;
00085     b[i]=sum;
00086   }
00087   for (i=N;i>=1;i--) {
00088     sum=b[i];
00089     for (j=i+1;j<=N;j++) sum -= a[i][j]*b[j];
00090     b[i]=sum/a[i][i];
00091   }
00092 }
00093 
00094 
00095 main(int argc, char *argv[])
00096 {
00097   int i, j, k = 1, l;
00098   double a[N+1][N+1], y[N+1][N+1], col[N+1], p;
00099   int indx[N+1];
00100   FILE *fptr;
00101   char s[256];
00102 
00103   for (i = XMIN; i <= XMAX; i++)
00104     for (j = YMIN; j <= YMAX; j++)
00105       if (OK(i,j)) {
00106         l = 1;
00107 /*
00108         a[k][l++] = QUAD(i);
00109         a[k][l++] = QUAD(j);
00110         a[k][l++] = CUBE(i)*j;
00111         a[k][l++] = i*CUBE(j);
00112         a[k][l++] = SQ(i)*SQ(j);
00113 */
00114         a[k][l++] = CUBE(i);
00115         a[k][l++] = CUBE(j);
00116         a[k][l++] = SQ(i)*j;
00117         a[k][l++] = i*SQ(j);
00118         a[k][l++] = SQ(i);
00119         a[k][l++] = SQ(j);
00120         a[k][l++] = i*j;
00121         a[k][l++] = i;
00122         a[k][l++] = j;
00123         a[k][l++] = 1.0;
00124         k++;
00125       }
00126   for (i = 1; i <= N; i++) {
00127     for (j = 1; j <= N; j++)
00128       printf("%g\t", a[i][j]);
00129     printf("\n");
00130   }
00131 
00132   ludcmp(a, indx, &p);
00133   for (j = 1; j <= N; j++) {
00134     for (i = 1; i <= N; i++) col[i] = 0.0;
00135     col[j] = 1.0;
00136     lubksb(a, indx, col);
00137     for (i = 1; i <= N; i++) y[i][j] = col[i];
00138   }
00139 
00140   printf("\n");
00141   for (i = 1; i <= N; i++) {
00142     for (j = 1; j <= N; j++)
00143       printf("%g\t", y[i][j]);
00144     printf("\n");
00145   }
00146 
00147   printf("\nu[i][j] = ");
00148   k = 1;
00149   for (i = XMIN; i <= XMAX; i++)
00150     for (j = YMIN; j <= YMAX; j++)
00151       if (OK(i,j)) {
00152         if (fabs(y[N][k]) > 1e-10) {
00153           printf("%g*u", y[N][k]);
00154           if (i == 0)
00155             printf("[i]");
00156           else if (i == 1)
00157             printf("[i+imin]");
00158           else
00159             printf("[i+%d*imin]", i);
00160 
00161           if (j == 0)
00162             printf("[j] ");
00163           else if (j == 1)
00164             printf("[j+jmin] ");
00165           else
00166             printf("[j+%d*jmin] ", j);
00167         }
00168         k++;
00169       }
00170   printf("\n");
00171 
00172 #define XFIG(x) (100*(x) + 100)
00173 #define YFIG(y) (100*(y) + 100)
00174 
00175   fptr = fopen("poly.fig", "wt");
00176   fprintf(fptr, "#FIG 2.1\n80 1\n");
00177   XfigStartCompound(fptr, XFIG((double)XMIN), YFIG((double)YMIN), 
00178                     XFIG((double)XMAX + 1), YFIG((double)YMAX + 1));
00179   for (i = XMIN; i <= XMAX + 1; i++)
00180     XfigLine(fptr, XFIG((double)i), YFIG((double)YMIN),
00181              XFIG((double)i), YFIG((double)YMAX + 1),
00182              XFIG_SOLID, 1, XFIG_BLACK);
00183   for (j = YMIN; j <= YMAX + 1; j++)
00184     XfigLine(fptr, XFIG((double)XMIN), YFIG((double)j),
00185              XFIG((double)XMAX + 1), YFIG((double)j),
00186              XFIG_SOLID, 1, XFIG_BLACK);
00187 
00188   XfigText(fptr, XFIG((double)0.5), YFIG((double)0.6),
00189            XFIG_CENTER, XFIG_TIMES_ROMAN, 24, 
00190            XFIG_BLACK, 0.0, "x");  
00191   k = 1;
00192   for (i = XMIN; i <= XMAX; i++)
00193     for (j = YMIN; j <= YMAX; j++)
00194       if (OK(i,j)) {
00195         if (fabs(y[N][k]) > 1e-10) {
00196           sprintf(s, "%g", y[N][k]);
00197           XfigText(fptr, XFIG((double)i + 0.5), YFIG((double)j + 0.6),
00198                    XFIG_CENTER, XFIG_TIMES_ROMAN, 24, 
00199                    XFIG_BLACK, 0.0, s);
00200         }
00201         k++;
00202       }
00203   XfigEndCompound(fptr);
00204   fclose(fptr);
00205 }

Generated on Wed Feb 19 22:26:50 2003 for Markers by doxygen1.2.18