Добрый день. Решение есть, но оно где-то неверное, не могу понять где. Необходимо решить задачу на отрезке [0, 1]. Шаг сетки h = 0.01. Количество разбиений N = 1/h = 100.
Итого мы имеем 101 узел сетки и 101 уравнение.
Первым шагом заменяю производную 2-го порядка разностным отношением:
Также заменяю производную 1-го порядка на начальном условии разностным отношением вперед и выполняю преобразования над ним:
- т.к. это граничное условие для x[0] узла, значит мы имеем решение для u[0] и u[1] (1-го и 2-го уравнения) в узлах x[0] и x[1] соответственно.
Формула нахождения решения для u(0) выглядит следующим образом, отсюда выразим
и
- отсюда имеем:
После всех преобразований имеем такую систему:
Далее методом прогонки я решаю СЛАУ из 98 уравнений, т.к. решения u(0), u(1) и u(n) известны. Решаю с помощью C++(если нужно, код прилагаю), но результаты мне не очень нравятся. Т.к. значение u(n) не равно 2.
Пожалуйста, подскажите, в чем ошибка.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double h = 0.01;
int N = 100; int k=0;
double x[100] = {0}, f[100] = {0}, u[100] = {0};
double X[100] = {0}, V[100] = {0};
double C[100] = {0};
double A = -4.0, B = -4.0;
u[N] = 2;
u[0] = u[1] = 0;
X[0] = 1;
V[0] = 0;
cout << "du/dx(0) = " << u[0] << ", u[N] = " << u[N] <<", h = " << h << endl << endl;
for ( int i = 0; i <= N; i++) {
x[i] = i*h;
f[i] = h*h*(sin(((M_PI)/2)*x[i]));
C[i] = 8+h*h*sin(x[i]);
}
for (int i = 0; i < N; i++) {
if (abs(C[i]) < abs(A)+abs(B))
cout << "Uslovie sxodimosti ne vipolneno!" << endl;
}
for (int i = 2; i <= N; i++) {
X[i] = B/(C[i]-A*X[i-1]);
V[i] = (A*V[i-1]-f[i])/(C[i]-A*X[i-1]);
X[N] = A/C[N];
V[N] = -f[N]/C[N];
}
for ( int i = N; i >= 2; i--) {
u[i] = X[i]*u[i+1]+V[i];
}
cout << "i | " << " X | " << " V | " << " u | " << endl;
cout << "----------------------------------" << endl;
for (int i = 0; i < N; i++)
cout << i << " | " << X[i] << " | " << V[i] << " | " << u[i] << " | " << endl;
cout << N << " | " << X[N] << " | " << V[N] << " | " << u[N] << " | " << endl;
cout<<"Proverka: "<<endl;
cout<< A*u[49]-C[50]*u[50]+B*u[51] << " = " << f[50] <<endl;
}