Line | |
---|
1 | #define NRANSI
|
---|
2 | #include "nrutil.h"
|
---|
3 | #define FREERETURN {free_dvector(h,1,n);free_dvector(g,1,n);return;}
|
---|
4 |
|
---|
5 | void dtoeplz(double r[], double x[], double y[], int n)
|
---|
6 | {
|
---|
7 | int j,k,m,m1,m2;
|
---|
8 | double pp,pt1,pt2,qq,qt1,qt2,sd,sgd,sgn,shn,sxn;
|
---|
9 | double *g,*h;
|
---|
10 |
|
---|
11 | if (r[n] == 0.0) nrerror("dtoeplz-1 singular principal minor");
|
---|
12 | g=dvector(1,n);
|
---|
13 | h=dvector(1,n);
|
---|
14 | x[1]=y[1]/r[n];
|
---|
15 | if (n == 1) FREERETURN
|
---|
16 | g[1]=r[n-1]/r[n];
|
---|
17 | h[1]=r[n+1]/r[n];
|
---|
18 | for (m=1;m<=n;m++) {
|
---|
19 | m1=m+1;
|
---|
20 | sxn = -y[m1];
|
---|
21 | sd = -r[n];
|
---|
22 | for (j=1;j<=m;j++) {
|
---|
23 | sxn += r[n+m1-j]*x[j];
|
---|
24 | sd += r[n+m1-j]*g[m-j+1];
|
---|
25 | }
|
---|
26 | if (sd == 0.0) nrerror("dtoeplz-2 singular principal minor");
|
---|
27 | x[m1]=sxn/sd;
|
---|
28 | for (j=1;j<=m;j++) x[j] -= x[m1]*g[m-j+1];
|
---|
29 | if (m1 == n) FREERETURN
|
---|
30 | sgn = -r[n-m1];
|
---|
31 | shn = -r[n+m1];
|
---|
32 | sgd = -r[n];
|
---|
33 | for (j=1;j<=m;j++) {
|
---|
34 | sgn += r[n+j-m1]*g[j];
|
---|
35 | shn += r[n+m1-j]*h[j];
|
---|
36 | sgd += r[n+j-m1]*h[m-j+1];
|
---|
37 | }
|
---|
38 | if (sd == 0.0 || sgd == 0.0) nrerror("dtoeplz-3 singular principal minor");
|
---|
39 | g[m1]=sgn/sgd;
|
---|
40 | h[m1]=shn/sd;
|
---|
41 | k=m;
|
---|
42 | m2=(m+1) >> 1;
|
---|
43 | pp=g[m1];
|
---|
44 | qq=h[m1];
|
---|
45 | for (j=1;j<=m2;j++) {
|
---|
46 | pt1=g[j];
|
---|
47 | pt2=g[k];
|
---|
48 | qt1=h[j];
|
---|
49 | qt2=h[k];
|
---|
50 | g[j]=pt1-pp*qt2;
|
---|
51 | g[k]=pt2-pp*qt1;
|
---|
52 | h[j]=qt1-qq*pt2;
|
---|
53 | h[k--]=qt2-qq*pt1;
|
---|
54 | }
|
---|
55 | }
|
---|
56 | nrerror("dtoeplz - should not arrive here!");
|
---|
57 | }
|
---|
58 | #undef FREERETURN
|
---|
59 | #undef NRANSI
|
---|
Note:
See
TracBrowser
for help on using the repository browser.