@EgaNator
Учусь на программиста

Метод конечных разностей и метод прогонки, правильно ли выводится результат?

Добрый день! Дана задача, в которой надо решить дифференциальную краевую задачу второго порядка на отрезке с помощью метода конечных разностей, а сами корни найти с помощью метода прогонки. Уравнение получилось таким: -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;
}
  • Вопрос задан
  • 86 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы