www.pudn.com > cghost.rar > JLPLQ.C
#include "stdlib.h"
int jlplq(a,b,c,m,n,x)
int m,n;
double a[],b[],c[],x[];
{ int i,mn,k,j,l,*js;
double s,z,dd,y,*p,*d;
extern int brinv();
extern void brmul();
js=malloc(m*sizeof(int));
p=malloc(m*m*sizeof(double));
d=malloc(m*(m+n)*sizeof(double));
for (i=0; i<=m-1; i++) js[i]=n+i;
mn=m+n; s=0.0;
while (1==1)
{ for (i=0; i<=m-1; i++)
for (j=0; j<=m-1; j++)
p[i*m+j]=a[i*mn+js[j]];
l=brinv(p,m);
if (l==0)
{ x[n]=s; free(js); free(p);
free(d); return(l);
}
brmul(p,a,m,m,mn,d);
for (i=0; i<=mn-1; i++) x[i]=0.0;
for (i=0; i<=m-1; i++)
{ s=0.0;
for (j=0; j<=m-1; j++)
s=s+p[i*m+j]*b[j];
x[js[i]]=s;
}
k=-1; dd=1.0e-35;
for (j=0; j<=mn-1; j++)
{ z=0.0;
for (i=0; i<=m-1; i++)
z=z+c[js[i]]*d[i*mn+j];
z=z-c[j];
if (z>dd) { dd=z; k=j;}
}
if (k==-1)
{ s=0.0;
for (j=0; j<=n-1; j++)
s=s+c[j]*x[j];
x[n]=s; free(js); free(p);
free(d); return(1);
}
j=-1;
dd=1.0e+20;
for (i=0; i<=m-1; i++)
if (d[i*mn+k]>=1.0e-20)
{ y=x[js[i]]/d[i*mn+k];
if (y