Добрый день! Дана задача, в которой надо решить дифференциальную краевую задачу второго порядка на отрезке с помощью метода конечных разностей, а сами корни найти с помощью метода прогонки. Уравнение получилось таким: -0,25u*(j-1)-(-0,5-2*h^2 )*u(j)-0,25u(j+1)=x(j)^2 * h^2+0,5*x(j) * h^2
Здесь коэффициенты А = В = -0,25 , С = -0,5-2*h^2.
Даны граничные условия на отрезке [0, 1]: u[0] = 2, u[1] = 1.
Шаг h = 0,01.
Я реализовал код, привожу его ниже. По проверке всё сходится. Но первый корень u[0], который выводится равен 29,8827.
Хотя поидее он должен равняться первому граничному условию, т.е. двум. Последний корень u[100] = 1, т.е. равен второму граничному условию на конце отрезка.
Вот вопрос, правильно ли я реализовал код? Ещё раз повторюсь, по проверка срабатывает.
Спасибо заранее за помощь!
Код:
#define _USE_MATH_DEFINES
#include <iostream>
#include<conio.h>
const int NotUsed = system("color F0");
using namespace std;
double F(double x)
{
return ((x*x) + (0.5*x));
}
int main()
{
setlocale(LC_ALL, "Russian");
const int N = 100;
const double h = 0.01;
double A = -0.25;
double B = -0.25;
double C = (-0.5 - 2*(pow(h, 2)));
double X[N + 1];
double V[N + 1];
double u[N + 1];
double Fc[N + 1];
for (int i = 0; i < N + 1; i++)
{
Fc[i] = F(i*h);
}
u[0] = 2;
u[N] = 1;
X[0] = -0.25 / C;
V[0] = (-0.25 - Fc[0] / C);
//X[0] = 0;
//V[0] = 0;
// Прямой ход
for (int i = 1; i < N; i++)
{
X[i] = B / (C - A * X[i - 1]);
V[i] = (A*V[i - 1] - Fc[i]) / (C - A * X[i - 1]);
}
// Обратный ход
for (int i = N - 1; i >= 0; i--)
{
u[i] = X[i] * u[i + 1] + V[i];
}
cout << "Решение" << endl;
for (int i = 0; i < N + 1; i++)
{
cout << "u[" << i << "] = " << u[i] << endl;
}
cout << endl;
cout << "Проверка" << endl;
for (int i = 1; i < N; i++)
{
cout << A * u[i - 1] - C * u[i] + B * u[i + 1] << " = " << F(i*h) << endl;
}
_getch();
return 0;
}