1

1D ポアソン方程式を解いて、コンデンサの誘電体の 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;
}
4

1 に答える 1

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]);
}

の場合、 V 配列の長さを超える にj=10アクセスします。V[11]それは初期化されていないメモリを読み取るため、おそらく方程式が収束しない理由を説明しています。

于 2018-02-13T23:22:43.893 に答える