Метод Конечных Разностей Для Уравнения В Частных Производных

Тема в разделе "C/C++/C#", создана пользователем illuminates, 7 ноя 2013.

  1. illuminates

    illuminates New Member

    Регистрация:
    4 ноя 2013
    Сообщения:
    2
    Симпатии:
    0
    Вычисляю по явной схеме. Выдает какие-то очень большие числа. Подскажите пожалуйста где ошибка.


    Код (C++):
    int main ( void )
    {
    setlocale(LC_ALL, "rus");

    int I = 10, J = 30, i, j;
    double T = 3.3, h_x = 0.1, h_t = 0.11, epsilon = h_t + pow(h_x, 2), c;
    double **u = new double *[I + 1];
    for (i = 0; i <= I; i++) u[i] = new double [J + 1];

    cout<< "Схема может быть неустойчива при значениях Х :\n";
    for (i = 0; i <= I; i++)
    {
    c = 3 * (1.1 - 0.5 * h_x * i) * h_t * pow(h_x, -2);
    if (c > 0.5) cout << i * h_x << "  ";
    }
    cout <<"\n";

    //нулевой слой (j = 0)
    for (i = 0; i <= I; i++)
    {
    u [i][0] = 0.01 * (1 - i * h_x); //НУ, несоответствие ГУ и НУ!
    }
    for (i = 1; i < I; i++)
    //последующие слои
    for (j = 0; j <= J; j++) //расчёт j + 1 - го слоя по j-му
    {
    u [0][j + 1] = 0; //ГУ
    u [i][j + 1] = u [i][j] + h_t * (3 * (1.1 - 0.5 * h_x * i) * (u [i + 1][j] -2 * u [i][j] + u [i - 1][j])/ pow(h_x, 2) + exp(h_t * j) - 1);
    u [I][j + 1] = 0; //ГУ
    }


    ofstream out;
    out.open ("D:\\proga7.txt");

    out << "U = U(0.6, t):\n";
    cout << "U = U(0.6, t):\n";
    for (i = 0; i <= J; i++)
    {
    out << h_t * i <<"\t"<< u [6][i] <<"\n";
    cout << h_t * i <<"\t"<< u [6][i] <<"\n";
    }
    out << "\n U = U(x, 0.33):\n";
    cout << "\n U = U(x, 0.33):\n";
    for (i = 0; i <= I; i++)
    {
    out << h_x * i <<"\t"<< u [i][3] <<"\n";
    cout << h_x * i <<"\t"<< u [i][3] <<"\n";
    }
    out << "\n U = U(x, 0.66):\n";
    cout << "\n U = U(x, 0.66):\n";
    for (i = 0; i <= I; i++)
    {
    out << h_x * i <<"\t"<< u [i][6] <<"\n";
    cout << h_x * i <<"\t"<< u [i][6] <<"\n";
    }
    out << "\n U = U(x, 1.32):\n";
    cout << "\n U = U(x, 1.32):\n";
    for (i = 0; i <= I; i++)
    {
    out << h_x * i <<"\t"<< u [i][12] <<"\n";
    cout << h_x * i <<"\t"<< u [i][12] <<"\n";
    }
    out.close();
    getch();
    return 0;
    }



    также мне нужно построить с точностью 0.0001, как это можно сделать?
    знаю лишь формулу O(\tau+h^2), что означает скорость сходимости схемы к исходной задачи

    Зарание большое спасибо!
     
Загрузка...

Поделиться этой страницей