Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Evgenij Masherov                     2:5020/175.2   07 Feb 2002  11:10:23
 To : Edward Avernin
 Subject : Re: задача нахождения соб.векторов и соб.чисел
 -------------------------------------------------------------------------------- 
 
 Wed Feb 06 2002 22:31, Edward Avernin wrote to Evgenij Masherov:
 
  EA> From: "Edward Avernin" <edward@atnet.ru>
 
  EA> Здравствуйте Евгений!
  EA> У меня задача -  рассчитать любую матрицу(она также может быть и
  EA> симметричной, но не всегда).
 
 Вот программка, реализующая метод Якоби
 (Матрица симметрична, хранится общим способом, в процессе счета слегка
 портится...)
 Оригинальность алгоритма - в реализации поиска максимального элемента за O(N)
 шагов и использовании вместо обычных вращений - по Джентльмену.
 void jacm(int n,double **a,double *d,double **v)
 {
 int i,j,p,q,*ind,*flag,fall;
 double c,s,t,h,g,theta,maxa,t1,t2,tmp,*amax,*w,prec;
 if((amax=(double*)calloc(n,sizeof(double)))==NULL)goto E0;
 if((w=(double*)calloc(n,sizeof(double)))==NULL)goto E1;
 if((ind=(int*)calloc(n,sizeof(int)))==NULL)goto E2;
 if((flag=(int*)calloc(n,sizeof(int)))==NULL)goto E3;
 prec=1e-12;
 for(p=0;p<n;p++)
 {
 d[p]=a[p][p];
 w[p]=1e0;
 for(q=0;q<n;q++) v[p][q]=0;
 v[p][p]=1e0;
 }
 for(p=0;p<n-1;p++)
 {ind[p]=0;amax[p]=0;flag[p]=1;
 for(q=p+1;q<n;q++) {if (fabs(a[p][q])>=amax[p])
 {amax[p]=fabs(a[p][q]);ind[p]=q;}}
 }
 amax[n-1]=-1;ind[n-1]=0;fall=1;
 while(fall!=0)
 {maxa=0;p=-1;q=0;
 for(i=0;i<n;i++)
 {if ((amax[i]>maxa)&&(flag[i]!=0)){p=i;maxa=amax[i];q=ind[p];}}
 if(p<0) fall=0;
  else if (amax[p]<((fabs(d[p]+1e0))*prec)) flag[p]=0;
   else {
  h=d[q]-d[p];
 if (fabs(a[p][q])<(fabs(h)*prec)) t=a[p][q]/h;
  else
 {theta=0.5*h/a[p][q];t=1e0/(fabs(theta)+sqrt((double)(1e0+theta*theta)));
    if (theta<0) t=-t;}
    c=1e0/sqrt((double)(1e0+t*t));
    s=t*c;
    h=t*a[p][q];
    d[p]-=h;d[q]+=h;
    a[p][q]=0;
    amax[p]=0;amax[q]=0;
    for(j=0;j<p;j++)
    {g=a[j][p];h=a[j][q];
     a[j][p]=c*g-s*h;
     a[j][q]=c*h+s*g;}
    for(j=p+1;j<q;j++)
    {g=a[p][j];h=a[j][q];
     a[p][j]=c*g-s*h;
     a[j][q]=c*h+s*g;}
    for(j=q+1;j<n;j++)
    {g=a[p][j];h=a[q][j];
     a[p][j]=c*g-s*h;
     a[q][j]=c*h+s*g;}
   if (fabs(c)>fabs(s))
   {t1=t*w[q]/w[p];t2=t*w[p]/w[q];
    w[p]=w[p]*c;w[q]=w[q]*c;
    for(j=0;j<n;j++)
    {g=v[j][p];h=v[j][q];
     v[j][p]=g-t1*h;
     v[j][q]=t2*g+h;}}
    else {t1=w[p]/w[q]/t;t2=w[q]/w[p]/t;
   tmp=w[q]*s;w[q]=w[p]*s;w[p]=tmp;
    for(j=0;j<n;j++)
    {g=v[j][p];h=v[j][q];
     v[j][p]=t1*g-h;
     v[j][q]=g+t2*h;}}
   for(j=0;j<n-1;j++)
   {
   flag[j]=1;
   if((j==p)||(j==q)||(ind[j]==p)||(ind[j]==q))
   {
   amax[j]=0;ind[j]=0;
    for(i=j+1;i<n;i++)
    {
     tmp=fabs(a[j][i]);
     if(amax[j]<tmp)
     {
     amax[j]=tmp;
     ind[j]=i;
     }
    }
   }
   }
   }
   }
   for(p=0;p<n;p++)
    for(q=0;q<n;q++)
     {v[p][q]*=w[q];
     if(p>q) a[q][p]=a[p][q];}
  for(p=0;p<n-1;p++)
   for(q=p+1;q<n;q++)
    if(d[p]<d[q])
    {tmp=d[p];d[p]=d[q];d[q]=tmp;
     for(j=0;j<n;j++)
      {tmp=v[j][p];v[j][p]=v[j][q];v[j][q]=tmp;}
    }
 free(flag);
 E3:
 free(ind);
 E2:
 free(w);
 E1:
 free(amax);
 E0:;
 return;
 }
  EA> Мне нужно вывести все СЗ, и обязательно все СВ, интервал не задан. И
  EA> кажется
  EA> у меня даже описание
  EA> итерационного метода не полное(многое не понятно). Hет ли у Вас
  EA> алгоритмов и примеров с решением этой задачи,
  EA> сейчас подойдет даже итерационный метод(кстати он случайно не для
  EA> нахождения max СЗ ?).
 
 Метод прямых итераций сходится к максимальному СЗ. Hебольшой модификацией
 исходной матрицы он приспосабливается к нахождению минимального СЗ.
 Метод обратных итераций дает СВ для заданного СЗ (которое находится QR или
 бисекциями).
 
 Евгений Машеров АКА СанитарЖеня
 
 --- ifmail v.2.15
  * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: задача нахождения соб.векторов и соб.чисел   Edward Avernin   06 Feb 2002 12:29:34 
 Re: задача нахождения соб.векторов и соб.чисел   Evgenij Masherov   06 Feb 2002 13:40:38 
 Re: задача нахождения соб.векторов и соб.чисел   Edward Avernin   06 Feb 2002 23:31:02 
 Re: задача нахождения соб.векторов и соб.чисел   Evgenij Masherov   07 Feb 2002 11:10:23 
Архивное /ru.algorithms/3300188a17c8.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional