【问题标题】:Solving 1D Poisson Equation with Gauss Seidel Red Black用 Gauss Seidel 红黑求解一维泊松方程
【发布时间】:2018-02-13 23:08:57
【问题描述】:

我正在尝试求解一维泊松方程,以模拟电容器电介质中 10 微米间隔的电势。我遇到的主要问题是红色/黑色 Gauss-Seidel 代码似乎实际上并未更新潜在矩阵中的值,因此不会收敛。

#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;
}

【问题讨论】:

    标签: c++ linear-equation


    【解决方案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 数组的长度。这将在未初始化的内存中读取,所以这可能解释了为什么你的方程没有收敛。

    【讨论】:

    • 实际上,我相信您会读入 Q 数组,而不是未初始化的内存。不管怎样,这可能不是你想要的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多