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

Метод релаксации неправильно работает - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Не могу понять свою ошибку! http://www.cyberforum.ru/cpp-beginners/thread548873.html
Здравствуйте! Скажите, в чем моя ошибка... При вводе чисел 1 1 1 в исходный файл программа выдаёт "YES", но при вводе 2 2 4, программа выдает "NO"... #include <iostream> using namespace std; ...
C++ Как нарисовать график? У меня заданы функции: y1=a0+a1*x/exp(1/x) y2=a0+a1*log(sqrt(x)) и массив известных значений У a0,a1 известны, x- заданный массив как построить график, этих функций (y,y1,y2) в консоли? http://www.cyberforum.ru/cpp-beginners/thread548849.html
C++ Деревья
Не можете ли подсказать как решить задачку: Проверить, является ли двоичное дерево AVL-деревом?
C++ Vectored handler
объясните пожалста, почему по окончании обработки исключения, не восстанавливается флаг TF ??? AddVectoredExceptionHandler(1, VectoredHandler); .. взводим TF флаг .. любая команда...
C++ Пересекаются ли многоугольники? http://www.cyberforum.ru/cpp-beginners/thread548815.html
Дано 2 многоугольника Нужен алгоритм, который определяет, пересекаются они или нет
C++ Вызов функций из файлов. Всем доброго времени суток, столкнулся с такой проблеммой, у меня есть 2 файла, в каждом файле написана функция что-то обрабатывающая, мне нужно создать 3й файл и к нему подключить эти 2 файла, так... подробнее

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

Метод релаксации неправильно работает - C++

15.04.2012, 11:52. Просмотров 964. Ответов 0
Метки (Все метки)

Мне необходимо решить уравнение Пуассона методом релаксации для области во вложении. (Она целиком лежит в квадрате 3х3). Я написал код для метода релаксации, однако он даёт неправильный результат. Помогите найти ошибку.

N - количество частей, Omega - параметр релаксации, eps - точность, phi - матрица начальных приближений, f - функция распределения, U - нужная матрица.

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
void Relax(int N, double Omega, double eps, double phi[LEN][LEN], PF f, double U[LEN][LEN])
{
 double h = 3/(double)N;
 double ro[LEN][LEN];
 double c[LEN][LEN];
 for (int i = 0; i < N; i++)
  {
   double x = i * h;
   for (int j = 0; j < N; j++)
    {
      double y = j * h;
      if (x >= 1 && x <= 2)
       {
        if (y >= 1 && y <= 2)
         ro[i][j] = f(x,y);
        else
         ro[i][j] = 0;
       }
      else ro[i][j] = f(x,y);
    }
  }
 
  for (int i = 1; i < N-1; i++)
    for (int j = 1; j < N-1; j++)
     {
      if (i * h >= 1 && i * h <= 2)
       if (j*h >= 1 && j*h <= 2)
        U[i][j] = (1-Omega) * phi[i][j] + (Omega * (phi[i+1][j] + phi[i-1][j] + phi[i][j+1] + phi[i][j-1] + h*h*ro[i][j]))/4;
       else U[i][j] = 0;
      else  U[i][j] = (1-Omega) * phi[i][j] + (Omega/4) * (phi[i+1][j] + phi[i-1][j] + phi[i][j+1] + phi[i][j-1] + h*h*ro[i][j]);
     }
  Diff(U,phi,c,N);
 
  int k = 0;
 
  while (Norm1(c,N) >= eps)
  {
   for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
     phi[i][j] = U[i][j];
 
  for (int i = 1; i < N-1; i++)
    for (int j = 1; j < N-1; j++)
     {
      if (i * h >= 1 && i * h <= 2)
       if (j*h >= 1 && j*h <= 2)
        U[i][j] = (1-Omega) * phi[i][j] + (Omega/4) * (phi[i+1][j] + phi[i-1][j] + phi[i][j+1] + phi[i][j-1] + h*h*ro[i][j]);
       else U[i][j] = 0;
      else  U[i][j] = (1-Omega) * phi[i][j] + (Omega/4) * (phi[i+1][j] + phi[i-1][j] + phi[i][j+1] + phi[i][j-1] + h*h*ro[i][j]);
     }
 
   Diff(U,phi,c,N);
   Form1->ProgressBar1->Position = ++k;
  }
}
0
Изображения
 
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru