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
00109
00110
00111
00112
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 }