Здравствуйте.
Помогите найти ошибку в программе, которая решает линейную краевую задачу методом конечных разностей.
Даны следующие условия:
Отсюда получаем:
Код программы на С++ (решение СЛАУ я опустил):
Код:
#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. Такую СЛАУ вообще-то надо методом прогонки решать, я знаю. Пробовал, тоже фигня получается, мне кажется у меня ошибки в заполнении матриц, поэтому этот момент я пока упускаю.