2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Нужна помощь с методом конечных разностей
Сообщение22.12.2009, 01:07 


22/12/09
6
Здравствуйте.
Помогите найти ошибку в программе, которая решает линейную краевую задачу методом конечных разностей.
Даны следующие условия:
$
\[
\begin{gathered}
  ay'' - y = cos^2 \pi x + 2a\pi ^2 cos2\pi x, \hfill \\
  a = \frac{1}
{{400}},  y(0) = 0,y(1) = 0 \hfill \\ 
\end{gathered} 
\]
$

Отсюда получаем:
$\[
\begin{gathered}
  p(x) = 0; \hfill \\
  q(x) = 400; \hfill \\
  f(x) = 400\cos ^2 \pi x + 2\pi ^2 \cos 2\pi x; \hfill \\ 
\end{gathered} 
\]
$

Код программы на С++ (решение СЛАУ я опустил):
Код:
#define PI 3.1415926535897

double p(double x)
{
        return 0;
}

double q(double x)
{
        return 400;
}

double f(double x)
{
        return 400 * pow(cos(PI*x), 2) + 2 * PI * PI *cos(2*PI*x);
}

void main()
{
        double a = 400;
        long n = 16;

        double x0 = 0;
        double xn = 1;
        double y0 = 0;
        double yn = 0;
        double alpha0 = 1;
        double beta0 = 1;
        double h = fabs(xn - x0) / (double)(n - 1);

        double* x = new double[n];
        for(int i = 0; i < n; i++)
            x[i] = x0 + i*h;

        double** A = new double*[n];  // Трехдиагональная матрица
        double* B = new double[n];     // Вектор правой части

        for(int i = 0; i < n ; i++)
        {
            A[i] = new double[n];
            for(int j = 0; j < n; j++)
                A[i][j] = 0;
        }

        A[0][0] = alpha0;
        B[0] =  y0;
        for(int i = 0; i < n-2; i++)
        {

            A[i + 1][i] = 1 - h*p(x[i]) + h*h*q(x[i]);
            A[i + 1][i + 1] = h*p(x[i]) - 2;
            A[i + 1][i + 2] = 1;
            B[i + 1] = f(x[i]) * h * h;
        }

        A[n-1][n-1] = beta0;
        B[n-1] = yn;
       
        /// ....
        // Решаем СЛАУ методом Гаусса
}


Вроде все работает, но результаты - фигня полная :(
Вот пример:

N = 4
Матрица А:
Код:
   1.000   0.000   0.000   0.000
  45.444  -2.000   1.000   0.000
   0.000  45.444  -2.000   1.000
   0.000   0.000   0.000   1.000


Вектор свободных коэффициентов:
Код:
   0.000
  46.638
  10.014
   0.000


Решение:
Код:
   0.000
   2.492
  51.622
   0.000


Вроде все хорошо, но при увеличении количества интервалов искомая функция ведет себя очень странно:

N = 6
Матрица A:
Код:
   1.000   0.000   0.000   0.000   0.000   0.000
  17.000  -2.000   1.000   0.000   0.000   0.000
   0.000  17.000  -2.000   1.000   0.000   0.000
   0.000   0.000  17.000  -2.000   1.000   0.000
   0.000   0.000   0.000  17.000  -2.000   1.000
   0.000   0.000   0.000   0.000   0.000   1.000


Вектор свободных коэффициентов:
Код:
 
  0.000
  16.790
  10.716
   0.889
   0.889
   0.000


Решение:
Код:
   0.000
  11.327
  39.443
-102.954
-875.557
   0.000



При N = 10 решение "улетает" уже в положительную сторону:
Код:
   0.000
  -0.300
   3.597
  12.473
   9.638
-41.766
-131.500
-54.367
548.987
1371.128
   0.000


При дальнейшем увеличении N вроде как приходит точность:
Код:
0.000
  -1.756
  -3.250
  -4.045
  -3.771
  -2.238
   0.473
   3.966
   7.546
  10.323
  11.380
  10.003
   5.906
  -0.588
  -8.476
-16.155
-21.670
-23.118
-19.135
  -9.370
   5.173
  22.048
  37.618
  47.665
  48.301
  37.025
  13.686
-18.880
-54.824
-85.985
-103.358
-99.130
-68.939
-13.818
  58.705
134.870
196.564
224.763
204.057
127.408
   0.000


Вобщем, я что-то сделал не так, но не пойму что :)
Буду благодарен за любую помощь, может у кого-то найдутся исходники?

P.S. Такую СЛАУ вообще-то надо методом прогонки решать, я знаю. Пробовал, тоже фигня получается, мне кажется у меня ошибки в заполнении матриц, поэтому этот момент я пока упускаю.

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение22.12.2009, 02:09 


17/01/09
119
kometa_triatlon в сообщении #273965 писал(а):
Помогите найти ошибку в программе, которая решает линейную краевую задачу методом конечных разностей.

Ошибка не в программе (точнее, возможно, где-то в коде какие-то мелочи и есть, но это непринципиально). Ошибка в выборе метода решения задачи.

Судя по условию, задача учебная, причем Вам специально подложили грабли для того, чтобы Вы набили на них шишку. Эта затея удалась, с чем я Вашего преподавателя и поздравляю. :D

Дело вот в чем. Давайте посмотрим на характеристическое уравнение для соответствующего однородного дифференциального уравнения. Оно имеет вид $a\lambda^2 - 1 = 0$. Решения, соответственно, $\lambda_{1,2}=\pm 1/\sqrt{a}$. При имеющемся значении параметра это $\lambda_{1,2}=\pm 20$.

Это означает, что любое решение уравнения имеет вид $y=C_1\,e^{20\,x}+C_2\,e^{-20\,x}+R(x)$, причем функция $R(x)$, вообще говоря, является комбинацией чего-то тригонометрического (и, как следствие, не слишком сильно меняется с изменением $x$).

А теперь представьте себе, как будет вести себя любое численное решение Вашей краевой задачи из-за банальных вычислительных погрешностей. Для того, чтобы это решение, стартовав в $y(0)=0$, пришло в $y(1)=0$ (или наоборот, это непринципиально), коэффициенты $C_{1,2}$ должны быть найдены крайне точно, иначе экспоненты с большим по модулю показателем обеспечат вместо решения нечто, напоминающее генератор случайных чисел. Соответственно, выбранный Вами метод требует либо вычислений с огромной точностью (а не жалкие 15 знаков типа double), либо использования очень большого количества интервалов.

Для того, чтобы всех этих неприятностей не случилось, существует полезная вещь - метод дифференциальной прогонки. Вот о нем и почитайте (посмотрите в интернете). :D

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение22.12.2009, 02:29 


22/12/09
6
Вау. Спасибо огромное....
Я просто в шоке, буду искать.
Теперь я хоть понял что у меня происходит с программой. Я вообще-то не математик, а программист, таких тонкостей не знал.
Причем ведь не мехмат какой-нибудь, а второй курс факультета менеджмента и маркетинга. Наши преподы злые :)

-- Вт дек 22, 2009 01:41:03 --

Кстати, в условии задания сказано решить задачу методом конечных разностей второго порядка.
Тут у меня был первый порядок, но я так понимаю второй меня не спасет?
Видимо остается только мириться с такими погрешностями...

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение22.12.2009, 02:49 


17/01/09
119
kometa_triatlon в сообщении #273980 писал(а):
Я вообще-то не математик, а программист, таких тонкостей не знал.
Причем ведь не мехмат какой-нибудь, а второй курс факультета менеджмента и маркетинга.

Ну так моделировать какие-нибудь процессы роста-падения акций придется, а там такие штуки встречаются не так уж редко. :D

kometa_triatlon в сообщении #273980 писал(а):
Кстати, в условии задания сказано решить задачу методом конечных разностей второго порядка.
Тут у меня был первый порядок, но я так понимаю второй меня не спасет?

Производная-то второго порядка, так что порядок конечных разностей второй. Правда, та же дифференциальная прогонка - это тоже вариант метода конечных разностей.

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение22.12.2009, 02:52 


22/12/09
6
Что-то в рунете тяжеловато найти внятную и доступную информацию по таким вещам.
Может быть подскажете где искать? Ссылка, название учебника, ресурс с хорошими материалами по данной тематике? Был бы очень благодарен, а то даже хорошее описание конечно-разностной схемы удалось найти не сразу.

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение22.12.2009, 08:26 
Заслуженный участник


11/05/08
32166
kometa_triatlon в сообщении #273965 писал(а):
N = 6
Матрица A:
Код:
   1.000   0.000   0.000   0.000   0.000   0.000
  17.000  -2.000   1.000   0.000   0.000   0.000
   0.000  17.000  -2.000   1.000   0.000   0.000
   0.000   0.000  17.000  -2.000   1.000   0.000
   0.000   0.000   0.000  17.000  -2.000   1.000
   0.000   0.000   0.000   0.000   0.000   1.000

Это какая-то загадка, а не матрица. Она ж должна быть симметричной! Причём с жутко доминирующей главной диагональю. Соответственно (при таком-то малом количестве шагов) -- жутко хорошо обусловленной, и как ни решай систему -- одинаково хороший результат получится.

Фантом в сообщении #273975 писал(а):
Это означает, что любое решение уравнения имеет вид $y=C_1\,e^{20\,x}+C_2\,e^{-20\,x}+R(x)$, причем функция $R(x)$, вообще говоря, является комбинацией чего-то тригонометрического (и, как следствие, не слишком сильно меняется с изменением $x$).

А теперь представьте себе, как будет вести себя любое численное решение Вашей краевой задачи из-за банальных вычислительных погрешностей.

Очень хорошо будет себя вести. Наличие таких крутых экспонент как раз и означает, что мы о-очень далеки от спектра. Задача-то не пристрелкой решается, а системой.

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение22.12.2009, 12:17 


17/01/09
119
ewert в сообщении #274004 писал(а):
Очень хорошо будет себя вести. Наличие таких крутых экспонент как раз и означает, что мы о-очень далеки от спектра. Задача-то не пристрелкой решается, а системой.

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

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение22.12.2009, 12:38 


22/12/09
6
Цитата:
Это какая-то загадка, а не матрица.

Вполне возможно :)
Я использовал правую аппроксимацию производной:
$\[\begin{gathered}
  y_i^'  \approx \frac{{y_{i + 1}  - y_i }}
{h}, \hfill \\
  y{}_i^{''}  \approx \frac{{y_{i + 2}^{}  - 2y_{i + 1}  + y_i }}
{{h^2 }} \hfill \\ 
\end{gathered} 
\]$

Система уравнений имеет вид:
$\[
(1 - hp_i  + h^2 q_i )y_i  + ( - 2 + hp_i )y_{i + 1}  + y_{i + 2}  = f_i  \cdot h^2 
\]
$

Таким образом заполняются диагонали на строках со 2-й по n-1.
И еще краевые условия дают по одному уравнению (первая и последняя строка матрицы):
$\[y_0  = A\]\[y_n  = B\]$

Функции p и q от х не зависят, поэтому в каждой строчке получаем те же числа.
Вроде все правильно, или я где-то ошибся?

Вчера эксперементировал с программой, получил следующие результаты:
  • Если количество интервалов малое, решение действительно скачет как генератор рандома :)
  • При N больше тысячи начинает сходиться к точному решению
  • Параметр а у меня вводится пользователем, поигрался с ним, действительно: если а небольшое решение ведет себя "хорошо": с увеличением количества интервалов график не скачет, а сглаживается, уточняя найденную функцию

-- Вт дек 22, 2009 11:58:31 --

Бонус-трек: визуализация :)
При а = 400:
Изображение
Изображение
Изображение
Изображение
Изображение

-- Вт дек 22, 2009 12:02:37 --

а = 8:

Изображение
Изображение
Изображение
Изображение

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение22.12.2009, 18:50 
Заслуженный участник


11/05/08
32166
kometa_triatlon в сообщении #274049 писал(а):
Я использовал правую аппроксимацию производной:
$\[\begin{gathered}
  y_i^'  \approx \frac{{y_{i + 1}  - y_i }}
{h}, \hfill \\
  y{}_i^{''}  \approx \frac{{y_{i + 2}^{}  - 2y_{i + 1}  + y_i }}
{{h^2 }} \hfill \\ 
\end{gathered} 
\]$

Хрен знает, чему, как и зачем вас учили.

Используйте самую тупую, стандартную симметричную аппроксимацию для второй производной: $y''_i\approx{y_{i-1}-2y_{i}+y_{i+1}\over h^2}$. И получите прекрасную, симметричную (ну с точностью до граничных условий) и со всех точек зрения восхитительную матрицу.

А так -- Вы, судя по всему, попросту не ту диагональ и не к той прибавили. Хотя даже и в этом случае: цифирка 17 (и это при $n=6$-то) вызывает глубокие подозрения.

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение22.12.2009, 21:14 


22/12/09
6
Цитата:
Хрен знает, чему, как и зачем вас учили.

А меня не учили :)
Это мне самому появилась надобность разобраться. Нашел реферат, где эти схемы подробно описаны, реализовал. Теперь вот с вашей помощью разбираюсь.
Кстати, аппроксимация которую вы привели имеет порядок точности $O(h^2)$, а моя - $O(h)$, так что она еще не самая тупая))
Ок, спасибо, у меня и самого была мысля попробовать другой вариант аппроксимации.

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение22.12.2009, 21:49 
Заслуженный участник


11/05/08
32166
Фантом в сообщении #274040 писал(а):
, поскольку малые отклонения на границах могут приводить к сильнейшему разбросу в центре.

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

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение23.12.2009, 00:53 


17/01/09
119
ewert в сообщении #274207 писал(а):
И, следовательно, бесконечно малые изменения граничных условий -- приведут к бесконечно малому же изменению решений.

Бесконечно малые - да. Но мы же имеем дело, строго говоря, не с дифференциальным уравнением, а с разностной схемой. У которой все погрешности конечны, и соотношение между этими погрешностями из устойчивости (самой по себе) не следует.

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение23.12.2009, 07:37 
Заслуженный участник


11/05/08
32166
Фантом в сообщении #274268 писал(а):
мы же имеем дело, строго говоря, не с дифференциальным уравнением, а с разностной схемой. У которой все погрешности конечны, и соотношение между этими погрешностями из устойчивости (самой по себе) не следует.

Стандартный факт: точность схемы определяется порядком её аппроксимации и её (схемы) устойчивостью.

С последним всё достаточно тривиально, поскольку переменная только одна и поскольку исходный дифференциальный оператор симметричен и знакоопределён (отрицателен). Эти же свойства переносятся и на разностный оператор, если только не изуродовать его специально: раз уж аппроксимация есть, то наименьшее по модулю собственное число (а именно оно определяет норму обратного) примерно совпадает с соотв. собственным числом дифоператора, т.е. с некоторой константой. Следовательно -- задача устойчива.

Это если не принимать во внимание погрешности округления; а если принимать -- то кроме устойчивости надо учитывать ещё и число обусловленности матрицы. Но и с этим всё в порядке: наибольшее по модулю собственное число имеет порядок $h^{-2}$ -- следовательно, такой же порядок имеет и число обусловленности. И при любых практически мыслимых шагах это число не безумно велико. И особенно невелико именно потому, что константа перед второй производной мала: фактически до порядка двадцати узлов число обусловленности будет вообще порядка единицы, и лишь потом начнёт потихонечку возрастать.

 Профиль  
                  
 
 Re: Нужна помощь с методом конечных разностей
Сообщение24.12.2009, 22:55 


17/01/09
119
ewert в сообщении #274298 писал(а):
Это если не принимать во внимание погрешности округления; а если принимать -- то кроме устойчивости надо учитывать ещё и число обусловленности матрицы. Но и с этим всё в порядке: наибольшее по модулю собственное число имеет порядок $h^{-2}$ -- следовательно, такой же порядок имеет и число обусловленности. И при любых практически мыслимых шагах это число не безумно велико. И особенно невелико именно потому, что константа перед второй производной мала: фактически до порядка двадцати узлов число обусловленности будет вообще порядка единицы, и лишь потом начнёт потихонечку возрастать.

Логично. Пожалуй, я действительно несколько перестарался.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: mihaild


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group