You are on page 1of 4

/*5.2.

2 AR (rmle)*/
#define SSIZE(1024)*(1024)
#define SIZE 65
rmle(x,nd,a,order,sigma)
int nd,*order;
double x[],a[],*sigma;
{
static double s[SSIZE],am[SIZE];
static double kn,cn,dn,p,q,r,re[4],im[4],ccn,cdn,max,fkn,en;
int i,j,k,L,n,t,ne;
double funckn();
if(nd%2 !=0)
{
nd-=1;
if(nd<0) exit(1);
}
if(*order<0)
{
a[0]=am[0]=1.0;
for(i=0;i<SSIZE;i++) s[i]=0.0;
for(t=0;t<nd;t++) s[0]+=x[t]*x[t];
en=s[0];
*order=ne=0;
*sigma=en/nd;
}
else
{
ne=*order+1;
for(t=0;t<nd-ne;t++) s[(1+ne)*ne/2]+=x[t]*x[t+ne];
for(j=1;j<=ne;j++)
s[(1+ne)*ne/2+j]=s[ne*(ne-1)/2+j-1]-x[ne-1]*x[j-1]-x[nd-ne]*[ndj];
max=0.0;
cn=dn=0.0;
for(L=0;L<ne;L++)
{
ccn=cdn=0.0;
for(k=0;k<ne;k++)
{
if(k<ne-L){j=k; i=ne-L}
else {j=ne-L; i=k;}
ccn+=a[k]*s[i+1]*i/2+j;
if(k+1<ne-L){j=k+1; i=ne-L}
else {i=k+1; j=ne-L;}
cdn+=a[ne-1-k]*s[(i+1)*i/2+j];
}
cn+=a[L]*ccn;
dn+=a[L]*cdn;
}
}
if(dn!=0.0)
{
p=(nd-2*ne)*cn/((nd-ne)*dn);
q=-(ne*en+dn*nd)/((nd-ne)*dn);
r=-(nd*cn)/((nd-ne)*dn);
cardano(1.0,p,q,r,re,im);
if(dn>0.0)
{
for(t=1;t<=3;t++)
if(im[t]==0.0)

if(re[t]<1.0 && -1.0<re[t])

kn=re[t]

;
}
else if(dn<0.0)
{
for(t=1;t<3;t++)
if(im[t]==0.0)
if(re[t]<1.0 && -1.0<re[t])
{
fkn=funckn(re[t],en,cn,dn,nd,ne)
;
i=0;
if(fkn>=max)
{
max=fkn;
kn=re[t];
i+=1;
}
if(i=0) exit(1);
}
}
}
else
{
p=(-ne*en)/((nd-2*ne)*cn);
q=-nd/(float)(nd-2*ne);
sqroot(1.0,p.q.re,im);
for(t=0;t<2;t++)
if(im[t]==0.0)
if(re[t]<1.0 && -1.0<re[t]) kn=re[t];
}
if(ne>1)
{
for(t=1;t<ne;t++) a[]=am[t]+kn*am[ne-t];
for(t=1;t<ne;t++) am[t]=a[t];
am[ne]=a[ne]=kn;
en+=2.0*cn*kn+dn*kn*kn;
*sigma=en/nd;
}
else
{
a[1]+kn;
en+=2.0*cn*kn+dn*kn*kn;
*sigma=en/nd;
}
*order=ne;
}
#define ERROR -1
double funckn (kn,en,cn,dn,nd,n)
int nd,n;
double kn,en,cn,dn;
{
double res1,res2;
double pow();
res1=1.0-kn*kn;
res2=(en+2.0*cn*kn+dn*kn*kn)/nd;
if(res1>0.0 && res2>0.0)
{
res1=pow(res1,n/2.0);

res2=pow(res2,nd/2.0);
res1=res2;
}
else
{
res1=ERROR;
printf("function f(kn) error!\n");
}
return(res1);
}
#include<math.h>
sqroot(a,b,c,xr,yi)
double a,b,xr[].yi[];
{
int i;
double dd,sqrt();
if(a!=0.0)
{
dd=sqrt(dd);
xr[0]=(-b+dd)/(2.0*a);
xr[1]=(-b-dd/(2.0*a)'
yu[0]=yi[1]=0.0;
}
else
{
dd=-dd;
dd=sqrt(dd);
xr[0]=xr[1]=-b/(2.0*a);
yi[0]=dd/(2.0*a);
yi[1]=-yi[0];
}
}
else if(a==0.0 && b!=0.0)
{
xr[0]=xr[1]=-c/b;
yi[0]=yi[1]=0.0;
}
else xr[0]=xr[1]=yi[0]=yi[1]=0.0;
}
#include<math.h>
#define PAI 3.141592654
cardano(a,b,c,d,x,y)
double a,b,c,d,x[],y[];
{
double p,q,dd,v1,v2,u1,u2,r1,r2,f,L;
int k;
double sqrt(),pow(),atan(),sin(),cos();
p=(c/a)/3.0-((b/a)*(b/a))/9.0;
q=(2.0*b*b*b)/(27.0*a*a*a)-(b*c)/(a*a*3.0)+d/a;
dd=q*q+4.0*p*p*p;
if(dd<0.0 && dd > -1.0e-12) dd=0.0;
{
r1=0.5*(-q+sqrt(dd));
r2=0.5*(-q-sqrt(dd));
if(r1<0.0 && r2<0.0)
{
v1=-pow(-r1,1.0/3.0);

v2=-pow(-r2,1.0/3.0);
}
else if(r1>0.0 && r2<0.0)
{
v1=pow(r1,1.0/3.0);
v2=-pow(-r2,1.0/3.0);
}
else if(r1<0.0 && r2>=0.0)
{
v1=-pow(r1,1.0/3.0);
v2=pow(r2,1.0/3.0);
}
else
{
v1=pow(r1,1.0/3.0);
v2=pow(r2,1.0/3.0);
}
u1=v1+v2;
u2=v1-v2;
x[1]=u1-b/(a*3.0);
x[2]=-b/(a*3.0)-0.5*u1;
x[3]=x[2];
y[1]=0.0;
y[2]=sqrt(3.0)*u2*0.5;
y[3]=-y[2];
}
else
{
if(q==0.0) f=PAI/2.0;
else f=atan(sqrt(-dd)/(-q);
L=sqrt(-p);
x[1]=2.0*L*cos(f/3.0)-b/(a*3.0)'
x[2]=L*(2.0)*sin(PAI/6.0-f/3.0)-b/(a*3.0);
x[3]=L*(2.0)*sin(PAI/6.0+f/3.0)-b/(a*3.0);
y[1]=y[2]=y[3]=0.0;
if(f<0.0)
{
x[1]=-x[1]-2.0*b/(3.0*a);
x[2]=-x[2]-2.0*b/(3.0*a);
x[3]=-x[3]-2.0*b/(3.0*a);
}
}
}

You might also like