Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> метод конечных разностей для уравнения в частных п 
:(
    Опции темы
illuminates
Дата 7.11.2013, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.11.2013

Репутация: нет
Всего: нет



Вычисляю по явной схеме. Выдает какие-то очень большие числа. Подскажите пожалуйста где ошибка.

Код


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), что означает скорость сходимости схемы к исходной задачи

Зарание большое спасибо!

Это сообщение отредактировал(а) illuminates - 7.11.2013, 13:31
PM MAIL   Вверх
Фантом
Дата 7.11.2013, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Вы думаете, что уравнение в частных производных бывает только одно? Напишите, что именно Вы решаете и как конкретно это делаете; желающих восстанавливать все это по потенциально ошибочному коду, думаю, Вы не найдете.
PM   Вверх
illuminates
Дата 9.11.2013, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.11.2013

Репутация: нет
Всего: нет



Пожалуйста. Вот только формулы у вас не могу ввести коректно.

Задача такая:
[math]U_t=3(1,1-0,5x)U_{xx}+e^t-1[/math]
[math]$ U(0,t)=0$[/math]
[math]$ U(1,t)=0$[/math]
 [math]$U(x,0)=0.01(1-x)x$[/math]
 
Решение нужно  найти с точностью [math]$0.0001$[/math] на отрезке [math]$T=1/a^*, где a^*=\max a(x,t)$[/math]
Построить графики функций [math]$u(x^*,t), u(x,jt^*)$[/math] где [math]$x^*=0.6, t^*=T/10, j=1,2,4$[/math]

явная разностная схема такая:
([math]$u_t^{j+1}-u_i^j)/\tau=3(1,1-0,5x_i)(u_{i+1}^{j}-2u_i^j+u_{i-1}^j)/h^2+e^{t_j}+1$$[/math]

код программы:
Код


int main ( void )
{
    setlocale(LC_ALL, "rus");

    int I = 10, J = 30, i, j;
    double  T = 1.0/ pow(3.3, 0.5), h_x = 1.0/ I, h_t = T/ J, 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) * i * h_x;
        //u [i][0] = 1 - i * h_x;  //НУ, несоответствие ГУ и НУ!
    }
        //последующие слои
    for (j = 0; j <= J; j++)
    {
        for (i = 1; i < I; i++) //расчёт j + 1 - го слоя по j-му
        {
            u [0][j + 1] = 0; //ГУ u [0][j + 1] = 1;
            u [I][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);
        }
    }
    int Jv = J/10;

    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][Jv] <<"\n";
        cout << h_x * i <<"\t"<< u [i][Jv] <<"\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][Jv * 2] <<"\n";
        cout << h_x * i <<"\t"<< u [i][Jv * 2] <<"\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][Jv * 4] <<"\n";
        cout << h_x * i <<"\t"<< u [i][Jv * 4] <<"\n";
    }
    out.close();
    getch();
    return 0;
}


выводит следующее:
user posted image
PM MAIL   Вверх
Фантом
Дата 9.11.2013, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



В самой первой фразе: 
Цитата(illuminates @  7.11.2013,  14:28 Найти цитируемый пост)
Вычисляю по явной схеме.


 smile 

Посмотрите внимательнее на то, что Вы считаете (кстати, обратите внимание, в решаемом уравнении последний член у Вас "-1", а в разностной схеме "+1" - что правильно?). Это уравнение теплопроводности с переменным коэффициентом теплопроводности и источниковым членом, причем аж экспоненциальным (в случае с "-1" ситуация чуть получше, но ненамного). За счет источникового члена U везде очень быстро увеличивается, но из-за нулевых граничных условий получаются громадные градиенты. В итоге при разностной аппроксимации второй производной получается нечто, похожее на датчик случайных чисел, и счет идет в разнос, причем быстрее всего - рядом с концами интервала по x, что, собственно, и видно в Ваших результатах.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0770 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.