Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > С++ Метод релаксаций (Нужна помощь!)


Автор: Vladm 2.6.2008, 18:19
Мне очень нужен хотя бы отрывок кода С++ для релаксации СЛАУ.
Пытался сам реализовать: сначал под графический интерфейс, потом под консоль. Получилось заточить только под конкретный пример. Да и реализация, если честно, дурацкая: не учитывает точность, а получилось нужно вводить количество итераций... По заданию надо с точностью... в общем ((

Буду рад, если кто подскажет ))

Автор: Vladm 3.6.2008, 13:59
Неужели ни у кого нет примера этого метода на с++? (:

Автор: bronislav 3.6.2008, 16:17
Примеры есть http://google.com или http://forum.vingrad.ru/forum/index.php?show_type=forum&showforum=142

Автор: Vladm 3.6.2008, 17:24
bronislav, по первой ссылке действительно есть пример, только программа там работает неверно: заточена под конкретный пример, прочие не правильно решает (по Маткаду проверял). По второй ссылке результат поисков выдает мою просьбу и еще другого человека, которая так и осталась без ответа.  ((:

Автор: bronislav 3.6.2008, 19:22
Ну так выкладывай пример, который не до конца работает. Будет помошь в доработке. А написание кода с нуля вместо тебя это в http://forum.vingrad.ru/forum/forum/index.php?show_type=forum&showforum=142.

Автор: Vladm 3.6.2008, 21:04
Вот такая программа:
Код

#include <vcl.h>
#pragma hdrstop
#include<iostream.h>
#include<math.h>

int maximal(int n,double R0[]);

void main(){
int i,j,n,f,k,iter;
double S,det;
cout<<"N = ";cin>>n;
double *x=new double [n];
double **b=new double *[n];
for(i=0;i<n;i++)
  b[i]=new double[n+1];
double **a=new double *[n];
for(i=0;i<n;i++)
  a[i]=new double[n+1];
cout<<"N Interation:";
cin>>iter;
cout<<"Full Matrix:\n";
for(i=0;i<n;i++){
    for(j=0;j<=n;j++)
        cin>>b[i][j];
}
cout<<"Matrix for relaxion\n";
for(i=0;i<n;i++){
    for(j=0;j<n;j++)
      a[i][j]=-b[i][j]/b[i][i];
    a[i][n]=b[i][n]/b[i][i];
}
for(i=0;i<n;i++){
    for(j=0;j<n+1;j++)
        cout<<"  "<<a[i][j]<<" || ";
cout<<"\n";
}
double *x0=new double [n];
for(i=0;i<n;i++)
  x[i]=0.00;
double *R0=new double [n];
cout<<"X1(0)..Xn(0):\n";
for(i=0;i<n;i++)
    cin>>x0[i];
S=0.00;
for(i=0;i<n;i++){
    for(j=0;j<n;j++)
      S=S+a[i][j]*x0[i];
}
for(i=0;i<n;i++){
    R0[i]=a[i][n]-x0[i]+S;
    cout<<"R("<<i<<")="<<R0[i]<<" | ";
}
f=maximal(n,R0);
det=R0[f];
for(k=0;k<iter;k++){
cout<<"det{"<<k<<"}="<<det<<"\n";
 for(i=0;i<n;i++){
    if(i!=f) R0[i]=R0[i]+a[i][f]*det;
     else R0[i]=R0[i]-det;
 }
 for(i=0;i<n;i++)
        cout<<"R["<<i+1<<"]="<<R0[i]<<"    ";
x[f]=x[f]+det;
f=maximal(n,R0);
det=R0[f];
}
cout<<"\n";
for(i=0;i<n;i++)
  cout<<"X{"<<i+1<<"}="<<x[i]<<"\n";
cin.sync();
getchar();
delete []x;
delete []R0;
delete []x0;
delete []a;

}

int maximal(int n,double R0[]){
int i,f;
f=0.0;
for(i=0;i<n-1;i++){
  if(R0[i+1]>R0[i]) f=i+1;
}
return f;
}



Решает пример:
10x1 - 2x2 - 2x3 = 6
-x1 + 10x2 - 2x3 = 7
-x1 - x2 + 10x3 = 8
При семи итерациях навязки обращаются в ноль и получаем три корня {1;1;1}
Считаю в маткаде: тоже самое.

К примеру для этой системы:
4x1 + 3x2 + 3x3 = 4
2.5x1 + 4x2 + 6x3 = 5
6x1 + 2x2 + 4x3 = 7
по маткаду должны быть следующие ответы {0.757;-.581;0.905}
считаю программой: немогу получить нулевые навязки (не считает короче)

В основном я код этой проги понимаю, но не весь (:  Может кто подскажет где загвоздка? И как сделать чтобы учитывалась точность при доведении до нуля навязок?


Автор: bronislav 3.6.2008, 22:22
Цитата(Vladm @  3.6.2008,  20:04 Найти цитируемый пост)
но не весь (:

А что не понимаешь?

Теоретические основы метода релаксаций можно посмотреть в любой книге по численным методам, ну млм наприме вот http://window.edu.ru/window_catalog/redir?id=45612&file=unn039.pdf.

Добавлено через 14 минут и 39 секунд
Во первых, тебе не надо сводить невязки в точности к нулю.
Величина отклонения невязки от нуля и есть точность найденного решения.

Также в твоей программе зачем-то вводится количество итераций, хотя вычисления должны проводиться не по количеству итераций, а по достижения определенной точности.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)