Научная Петербургская Академия

Задача Дирихле - (реферат)

Задача Дирихле - (реферат)

Дата добавления: март 2006г.

    Задача Дирихле
    1. ПОСТАНОВКА ЗАДАЧИ
    Решить численно задачу Дирихле для уравнения Лапласа :
    (x, y)? ?D; u|Г=xy2=f(x, y) ;
    область D ограничена линиями: x=2 , x=4 , y=x , y=x+4 ;
    (x0, y0 ) = (3, 5) .

Следует решить задачу сначала с шагом по x и по y : h=0. 2, потом с шагом h=0. 1 . Точность решения СЛАУ? =0. 01 .

    2. ОПИСАНИЕ МЕТОДА РЕШЕНИЯ ПОСТАВЛЕННОЙ ЗАДАЧИ

Поставленная задача решается численно с помощью программы, реализующей метод сеток , разработанный для численного решения задачи Дирихле для уравнений эллептического типа.

Программа написана на языке C++ , в среде Borland C++ версии 3. 1. Ниже описан алгоритм работы этой программы.

1. На первом шаге область D дискретизируется. Она заменяется на область Dh путем разбиения области D параллельными прямыми по следующему правилу: yi=y0 ? ih, xj=x0 ? ih , i, j=0, 1, 2…. PР. Разбиение производится до тех пор, пока текущая прямая не будет лежать целиком вне области D. Получается множество точек (xi, yj). 2. За область Dh принимают те точки множества (xi, yj) , которые попали внутрь области D, а также дополняют это множество граничными точками.

3. Во всех точках области Dh вычисляются значения функции f(xi, yj) . 4. За область Dh* принимаются все внутренние точки области Dh, т. е. удовлетворяющие требованию: (xi, yj)? ? Dh* , если (xi+1, yj) ? Dh , (xi-1, yj)? ? Dh , (xi, yj+1)? ? Dh , (xi, yj-1)? ? Dh . 5. Во всех точках области Dh* вычисляется функция F(N)*[i, j] ( индекс N обозначает номер итерации, на которой производится вычисление):

F(N)*[i, j]=(f(xi+1, yj) + f(xi-1, yj) + f(xi, yj+1)? ?? f(xi, yj-1))/4 6. Теперь если max | F(N+1)*[i, j] - F(N)*[i, j]|
    3. ТЕКСТ ПРОГРАММЫ
    #include
    #include
    #include
    #include
    #include
    int i, j, k; // Variables
    float h, x, y, tmp, E1;
    struct point {
    float xx;
    float yy;
    int BelongsToDh_;
    int BelongsToDh;
    float F;
    float F_;
    } p0, arrayP[13][33];
    float arrayX[13];
    float arrayY[33];
    float diff[500];

void CreateNet(void); // Procedure Prototypes int IsLineFit(float Param);

    void CrMtrD(void);
    void RegArrayX();
    void RegArrayY();
    void CreateDh_();
    int IsFit(point Par);
    void FillF();
    void CreateDh();
    int IsInner(int i, int j);
    void FillF_();
    void CountDif();
    void MakeFile();
    void main(void) //MAIN
    {
    clrscr();
    p0. xx = 3;
    p0. yy = 5;
    h = 0. 2;
    p0. BelongsToDh_=1;
    p0. BelongsToDh=1;
    CreateNet();
    RegArrayX();
    RegArrayY();
    CrMtrD();
    CreateDh_();
    FillF();
    CreateDh();
    FillF_();
    CountDif();
    while (E1>=0. 005) {
    for(i=0; i    for(j=0; j    FillF_();
    CountDif();
    }
    cout    MakeFile();
    getchar();
    } //MAIN END

int IsLineFit(float par, char Axis) // does the line belong to the defined area {

    switch(Axis) (par    else return 0;
    case 'x': if (par    else if (par>4. 0) return 1;
    else return 0;
    
    }
    void CreateNet(void) // Creation of Net (area D )
    {
    x = p0. xx;
    i=0;
    arrayX[i]=x;
    while (! IsLineFit(x, 'x'))
    {
    x += h;
    i++;
    arrayX[i] = x;
    }
    x = p0. xx-h;
    i++;
    arrayX[i]=x;
    while (! IsLineFit(x, 'x'))
    {
    x -= h;
    i++;
    arrayX[i] = x;
    }
    for (i=0; i    printf("\n");
    y = p0. yy;
    i = 0;
    arrayY[i]=y;
    while (! IsLineFit(y, 'y'))
    {
    y += h;
    i++;
    arrayY[i] = y;
    }
    y = p0. yy - h;
    i++;
    arrayY[i]=y;
    while (! IsLineFit(y, 'y'))
    {
    y -= h;
    i++;
    arrayY[i] = y;
    }
    for(i=0; i    printf("\n");
    } // end CreateNet
    void RegArrayX() // Regulation of arrays X & Y
    {
    int LastUnreg = 13 ;
    while (LastUnreg ! = 0) {
    for(i=0; i    if (arrayX[i]>arrayX[i+1]) {double tmp=arrayX[i];
    arrayX[i]=arrayX[i+1];
    arrayX[i+1]=tmp; }}
    LastUnreg=LastUnreg-1; }
    for (i=0; i    } printf("\n");
    }
    void RegArrayY()
    {
    int LastUnreg = 33 ;
    while (LastUnreg ! = 0) {
    for(i=0; i    if (arrayY[i]>arrayY[i+1]) { tmp=arrayY[i];
    arrayY[i]=arrayY[i+1];
    arrayY[i+1]=tmp; }}
    LastUnreg=LastUnreg-1; }
    for (i=0; i    printf("\n"); } // End of Regulation
    void CrMtrD(void) //Create general Matrix
    {
    for(i=0; i    for(j=0; j    arrayP[i][j]. BelongsToDh=0; }
    for(i=0; i    for(j=0; j    arrayP[i][j]. xx=arrayX[i];
    arrayP[i][j]. yy=arrayY[j];
    }
    // printf("%g %g", arrayP[12][0]. xx, arrayP[12][0]. yy);
    // printf("\n");
    }
    int IsFit(point Par) //does point belong to area D?
    {
    if ((Par. xx=1. 99) && (Par. yy>=Par. xx)
    && (Par. yy    else return 0;
    }
    void CreateDh_(void) //Create area Dh_
    {
    for(i=0; i    for(j=0; j    if (IsFit(arrayP[i][j])) arrayP[i][j]. BelongsToDh_=1;
    cout     cout     }
    void FillF(void) // calc function F(x, y) at area Dh_
    {
    for(i=0; i    for(j=0; j    if (arrayP[i][j]. BelongsToDh_==1)
    arrayP[i][j]. F=arrayP[i][j]. xx*pow(arrayP[i][j]. yy, 2);
    else arrayP[i][j]. F=0;
    }
    int IsInner(int i, int j) //Is point inner?
    {
    if ((arrayP[i-1][j]. BelongsToDh_==1) &&
    (arrayP[i+1][j]. BelongsToDh_==1) &&
    (arrayP[i][j+1]. BelongsToDh_==1) &&
    (arrayP[i][j-1]. BelongsToDh_==1)) return 1;
    else return 0;
    }
    void CreateDh(void) //Create area Dh
    {
    for(i=0; i    for(j=0; j    if ((arrayP[i][j]. BelongsToDh_==1) &&
    IsInner(i, j))
    arrayP[i][j]. BelongsToDh=1;
    }
    void FillF_() //calc new appr. values of F
    {
    for(i=0; i    for(j=0; j    if (arrayP[i][j]. BelongsToDh==1)
    arrayP[i][j]. F_=(arrayP[i-1][j]. F+arrayP[i+1][j]. F+
    arrayP[i][j-1]. F+arrayP[i][j+1]. F)/4;
    else arrayP[i][j]. F_=0; }
    }
    void CountDif() // find maximal difference abs(F-F_)
    {
    k=0;
    for(i=0; i    for(j=0; j    { if (arrayP[i][j]. BelongsToDh==1) {
    diff[k]=fabs(arrayP[i][j]. F_-arrayP[i][j]. F);
    k++; }}
    E1=diff[0];
    for (k=1; k    if (diff[k]>E1) E1=diff[k]; }
    }
    void MakeFile()
    {
    ofstream f;
    FILE *f1=fopen("surf. dat", "w1");
    fclose(f1);
    f. open("surf. dat", ios: :out, 0);
    for(i=0; i    for(j=0; j    f    " "    f. close() ;
    }
    4. ГРАФИКИ РЕШЕНИЙ
    РИС. 1 шаг h=0. 2
    РИС. 2 шаг h=0. 1
    5. ВЫВОД

Функция f(x, y) является неотрицательной в области D. Полученное решение лежит целиком над плоскостью XOY . Для данного решения выполняется принцип максимума.



(C) 2009