Daredevil |
Отправлено: 23.10.2004, 14:39 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 22
|
У меня тут функция дана реализации метода Данилевского. Переведите ее пожалуйста на С, и по возможности, кто-нибудь объясните как она работает и что тут вообще происходит?(((
CODE | void danilevskyeigenvalues(ap::real_2d_array a, int n, ap::real_1d_array& q)
{
int i;
int j;
int k;
int l;
int u;
int recn;
double t;
double tmp;
double maxa;
bool succeed;
ap::real_1d_array q1;
ap::real_1d_array q2;
ap::real_2d_array b;
ap::real_2d_array c;
b.setbounds(1, n, 1, n);
c.setbounds(1, n, 1, n);
q.setbounds(0, n);
q1.setbounds(0, n);
q2.setbounds(0, n);
if( n==1 )
{
q(0) = a(1,1);
q(1) = -1;
return;
}
succeed = true;
for(u = n; u >= 2; u--)
{
maxa = fabs(a(u,u-1));
l = u-1;
for(i = u-2; i >= 1; i--)
{
if( fabs(a(u,i))>maxa )
{
maxa = fabs(a(u,i));
l = i;
}
}
if( maxa==0 )
{
succeed = false;
recn = u-1;
break;
}
for(i = 1; i <= n; i++)
{
t = a(i,u-1);
a(i,u-1) = a(i,l);
a(i,l) = t;
}
for(i = 1; i <= n; i++)
{
t = a(u-1,i);
a(u-1,i) = a(l,i);
a(l,i) = t;
}
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if( j!=u-1 )
{
b(i,j) = a(i,j)-a(i,u-1)*a(u,j)/a(u,u-1);
}
else
{
b(i,j) = a(i,j)/a(u,u-1);
}
}
}
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if( i!=u-1 )
{
c(i,j) = b(i,j);
}
else
{
c(i,j) = 0;
for(k = 1; k <= n; k++)
{
c(i,j) = c(i,j)+a(u,k)*b(k,j);
}
}
}
}
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
a(i,j) = c(i,j);
}
}
}
if( succeed )
{
q(n) = -2*(n%2)+1;
for(i = 0; i <= n-1; i++)
{
q(i) = -a(1,n-i)*q(n);
}
}
else
{
q1(n-recn) = -2*((n-recn)%2)+1;
for(i = 0; i <= n-recn-1; i++)
{
q1(i) = -a(recn+1,n-i)*q1(n-recn);
}
danilevskyeigenvalues(a, recn, q2);
for(i = 0; i <= n; i++)
{
q(i) = 0;
}
for(i = 0; i <= n-recn; i++)
{
for(j = 0; j <= recn; j++)
{
q(i+j) = q(i+j)+q1(i)*q2(j);
}
}
}
}
| |
|
Sl@Sh |
Отправлено: 23.10.2004, 18:40 |
|
Мастер участка
Группа: Участник
Сообщений: 383
|
Извените, вы имеете ввиду просто С или С++ ?
|
|
Daredevil |
Отправлено: 24.10.2004, 12:10 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 22
|
Я имею ввиду обычный С. А не С++!! |
|
Doga |
Отправлено: 24.10.2004, 15:08 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
Если Вы найдёте описания классов "real_1d_array" и "real_2d_array" в пространстве имён "ap", то Вы и сами всё сделаете. А что происходит, понятно — обыкновенная рекурсия
|
|
Daredevil |
Отправлено: 25.10.2004, 22:19 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 22
|
а вы можете сказать сами? пожалуйста!!! мне очень надо!!!
Ну я не так хорошо понимаю в С, чтобы знать что такое обыкновенная рекурсия, помню, что рекурсия — это вызов функции самой себя, только на примере слабо это понимаю..
объясните конкретней пожалуйста!!! |
|
Daredevil |
Отправлено: 05.11.2004, 23:34 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 22
|
Блин!! Ну кто нибудь может это сделать? Ну я абсолютно не знаю С++, а мне нужна эта функция в С!! Срочно!!! Ну пожалуйста, люди!!! |
|
Doga |
Отправлено: 06.11.2004, 15:01 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
Ещё раз повторяю, только если Вы найдёте описания используемых в коде классов "real_1d_array" и "real_2d_array". Пока недостаточно данных ...
|
|
|