Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Решение СЛАУ методом минимальных невязок - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перевести строчку в _int64 http://www.cyberforum.ru/cpp-beginners/thread571207.html
есть массив char, но может быть и короче запись. концом массива есть символ '\0'. строка имеет вид 01000100111101 и тд. вот мне эту строчку нужно записать как число типа _int 64. написал функцию, но...
C++ Не читается входной файл using namespace std; int main () { freopen("input.txt", "r", stdin); string s, a; int i = 0, n = 0; getline(cin, s); http://www.cyberforum.ru/cpp-beginners/thread571184.html
MultiView na Ipad/Iphone C++
Как два View прикрутить в одно окно? Ipad/IPhone. Допустим пусть будет NavigationController и View-Based
C++ Сочините пример как можно проще на сдвиг
Сочините пример как можно проще на сдвиг. Сам пользоваться умею, не могу только придумать новичковую задачу на эти операторы и как их проиллюстрировать.
C++ Перевод из Delphi в C++ http://www.cyberforum.ru/cpp-beginners/thread571133.html
Есть код на Делфи помогите пожалуйста перевести его в С++Bulder. ...... const MapFName = 'D:\MIKHAILP\DOCUM\Projects\ISTC_robot \Pult\v04_1\Map\RTC_Dvor\RTC_Dvor.gst'; //интересует в принципе...
C++ С++ и Matlab Часть дипломного проекта решил реализовать по средствам совмещения Билдера и Matlaba. И возникла ошибка с которой никак не удается совладать. В этом участке кода , идет формирование матрицы , и... подробнее

Показать сообщение отдельно
DUKE009
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 3

Решение СЛАУ методом минимальных невязок - C++

12.05.2012, 12:40. Просмотров 4180. Ответов 0
Метки (Все метки)

Всем привет!
Помогите разобраться с данным методом, алгоритм я читал здесь:
http://www.physchem.chimfak.rsu.ru/S...ys_lin_eq.html

уже успел реализовать
функцию перемножения матрицы на вектор:
C++
1
2
3
4
5
6
7
8
9
10
void MatrVekt(int N, double **M, double *V, double *R)
//N- размерность, M- матрица, V- вектор, R- результат
{
for(int i=0; i<N; i++)
        {
        R[i]=0;
        for(int j=0; j<N; j++)
              R[i]+= M[i][j]*V[j];
        }
}
и часть алгоритма:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void MinNev(int N, double **A, double *F, double *X, float eps)
//N- размерность, A- матрица, F- вектор свободных членов, X-вектор результат
{
double *R = new double [N];
double *Delta = new double [N];
double *TempX = new double[N];
double maxi=0.0;
for (int i=0; i<N; i++)
    TempX[i]=0;//первое приближение задаём нулевым
do
{
MatrVekt(N, A, TempX, R);
for(int i=0; i<N; i++)
    {
    Delta[i]=F[i]-R[i];//Вектор невязок
    }
 
/////
maxi = fabs(X[0] - TempX[0]);
for(int i=0; i<N; i++)
    {
    if(fabs(X[i]-TempX[i])>maxi)
        maxi=fabs(X[i]-TempX[i]);
    X[i] = TempX[i];
    } 
}
while (maxi>=eps);
 
delete[] R;
delete[] Delta;
delete[] TempX;
}
Из теории мне не совсем ясно с параметром http://www.cyberforum.ru/cgi-bin/latex.cgi?\tau. Это тоже вектор? Получается чтобы его вычислить, нужно еще дополнительно написать функцию для векторного произведения?

Добавлено через 23 часа 30 минут
Немного посидел, и пришёл к такой реализации. Если не сложно, помогите найти ошибку. Суть в том, что при запуске функция уходит в бесконечный цикл. Условие выхода вроде реализовано верно. Короче не знаю в чём дело..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
void MinNev(int N, double **A, double *F, double *X, float eps)
//N- размерность, A- матрица, F- вектор свободных членов, X-вектор результат
{
    int count=0;
double *R = new double [N];
double *Delta = new double [N];
double *TempX = new double[N];
double maxi=0.0, Tau=0.0, TempTau=0.0;
for (int i=0; i<N; i++)
    TempX[i]=0;//первое приближение задаём нулевым
do
{
MatrVekt(N, A, TempX, R);
for(int i=0; i<N; i++)
    {
    Delta[i]=F[i]-R[i];//Вектор невязок
    }
MatrVekt(N, A, Delta, R);
for(int i=0; i<N; i++)
    {
    Tau+=-(R[i]*Delta[i])/(R[i]*R[i]);
    } 
for(int i=0; i<N; i++)
    {
    X[i]=TempX[i]-Tau*Delta[i];
    } 
 
maxi = fabs(X[0] - TempX[0]);
for(int i=0; i<N; i++)
    {
    if(fabs(X[i]-TempX[i])>maxi)
        maxi=fabs(X[i]-TempX[i]);
    }
count++;
}
while (maxi>=eps);
 printf("%d",count);
delete[] R;
delete[] Delta;
delete[] TempX;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru