Решение 1D-уравнения Пуассона с Гауссом Зайделем Красный Черный

Я пытаюсь решить одномерное уравнение Пуассона для моделирования потенциала с интервалами в 10 микрометров в диэлектрике конденсатора. Основная проблема, с которой я столкнулся, заключается в том, что красный / черный код Гаусса-Зейделя, по-видимому, не обновляет значения в потенциальной матрице и поэтому не сходится.

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
float x=0;
bool exit = false;
float V [11] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
float Q [11];
// set up q matrix
for (int i = 0; i <= 10; i++)
{
Q[i] = 50*sin(3.14*x/0.00001);
x += 0.00001;
}
while(!exit)
{
if(V[10] <= 3.29)
{
// red sweep
for(int i=1; i <= 10; i+=2)
{
V[i] = -0.5*(0.00001*Q[i]-V[i-1]-V[i+1]);
}
//black sweep
for(int j=2; j <= 10; j+=2)
{
V[j] = -0.5*(0.00001*Q[j]-V[j-1]-V[j+1]);
}
}
else exit=true;
}
for(int i=0;i<=10;i++)
{
cout << V[i] << endl;
}
return 0;
}

1

Решение

Берегись, я полагаю, вы читаете за пределами вашего V массив во время черной развертки:

//black sweep
for(int j=2; j <= 10; j+=2)
{
V[j] = -0.5*(0.00001*Q[j]-V[j-1]-V[j+1]);
}

когда j=10, вы будете получать доступ V[11], который превышает длину вашего V массива. Это будет чтение в неинициализированной памяти, что, вероятно, объясняет, почему ваше уравнение не сходится.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]