- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
double** QRSLAU_check(matrix n1, matrix n0, double eps){
double** x;
x = (double**) calloc(2,sizeof(double*));
x[0]= (double*) calloc(n1.i,sizeof(double));
x[1]=(double*) calloc(n1.i,sizeof(double));
for (int a=0; a<n1.i; a++){ x[0][a]=1; x[1][a]=1;}
for (int a=0; a<n1.i; a++)
for (int b=a+1; b<n1.i; b++)
if(n1.M[b][a]>eps || n1.M[b][a]<-eps) x[0][a]=0;
for (int a=0; a<n1.i-1; a++)
if(((n1.M[a][a]+n1.M[a+1][a+1])-(n0.M[a][a]+ n0.M[a+1][a+1]))>eps ||
((n1.M[a][a]+n1.M[a+1][a+1])-(n0.M[a][a]+ n0.M[a+1][a+1])) <-eps ||
((sqrt(-(n1.M[a][a]*n1.M[a][a]+ n1.M[a+1][a+1]*n1.M[a+1][a+1]-2*n1.M[a+1][a+1]*n1.M[a][a]+4*n1.M[a][a+1]*n1.M[a+1][a])))-
(sqrt(-(n0.M[a][a]*n0.M[a][a]+ n0.M[a+1][a+1]*n0.M[a+1][a+1]-2*n0.M[a+1][a+1]*n0.M[a][a]+4*n0.M[a][a+1]*n0.M[a+1][a]))))>eps ||
((sqrt(-(n1.M[a][a]*n1.M[a][a]+ n1.M[a+1][a+1]*n1.M[a+1][a+1]-2*n1.M[a+1][a+1]*n1.M[a][a]+4*n1.M[a][a+1]*n1.M[a+1][a])))-
(sqrt(-(n0.M[a][a]*n0.M[a][a]+ n0.M[a+1][a+1]*n0.M[a+1][a+1]-2*n0.M[a+1][a+1]*n0.M[a][a]+4*n0.M[a][a+1]*n0.M[a+1][a]))))<-eps){
x[1][a]=0;
if(a==n1.i-2)x[1][a+1]=0;
}
else a++;
return x;
}
какая-та штука для QR-алгоритма и поиска собственных значений
TarasB 09.06.2010 20:58 # +2
xaionaro 10.06.2010 02:36 # +3
К тому же намного больше проблемы от того, что внутри цикла используется sqrt() и двойное сравнивание, вместо использования fabs(). Лучше б возвели eps в квадрат, чем брать sqrt() от чего-либо. (хотя с другой стороны надо надеяться, что eps не настолько мал, чтобы это привело к неприятным последствиям)
xaionaro 10.06.2010 02:55 # 0
Stalker 10.06.2010 07:37 # 0
Вот что по 2 раза одно и то же считается, это да.
xaionaro 12.06.2010 10:10 # 0
TarasB 11.06.2010 13:02 # 0
> что eps не настолько мал, чтобы это привело к неприятным последствиям
1E-3000?
Shiz89 10.06.2010 08:35 # 0
Stalker 09.06.2010 23:55 # 0
if ((bla-bla-bla) > eps || (bla-bla-bla) < -eps)
dj_quake 10.06.2010 14:07 # 0
dj_quake 10.06.2010 14:07 # −6