Добрый день! Следует решить следующую линейную краевую задачу методом конечных разностей в Mathematica:
Точное решение будет:
У меня почему-то не правильный ответ получается. Пробовала и заново перебивать и всё несколько дней проверяю, но ошибку найти никак не могу, помогите, пожалуйста найти ошибку. Хоть в какой части программы она.
Код:
resh := (p = 2/(x + 1); q = \[Pi]^2; a = 0; A = 2 - \[Pi]; b = 1;
B = -\[Pi]/2 - 1/4; n = 5; h = (b - a)/n; f = 0;
a11 = -1;
(*Введены начальные данные*)
(*Разбитие по оси х и вычисление начальных коэффициентов*)
M = Array[с, {n, 3}];
For[i = 1, i < n + 1, i++, xi = a + h*i;
pi = 2/(xi + 1);
(*yi+1 + miyi + ki yi-1 = fi*)
a1 = (2*q*h^2 - 4)/(2 + pi*h); (*mi*)
a2 = (2 - pi*h)/(2 + pi*h); (*ki*)
a3 = 3*h^2*f/(2 + pi*h);(*fi*)
M[[i]] = {a1, a2, a3};
] ;
(*Print[N[M//MatrixForm,15]];*)
p1 = 2/(a + h*1 + 1 );
k1 = (2 - p1*h)/(2 + p1*h);
m1 = (2*q*h^2 - 4)/(2 + p1*h);
f1 = 0;
(*записываеим первое граничное условие,
с учетом формулы 1 из блока*)
(*s,r,...*)
r = 2 h - 3*a11 + a11*k1;
s = 4*a11 + a11*m1;
(*Print[{r,s}];*)
(*Заключительная формула из блока с учетом второго граничного \
условия*)
M[[n]] = {a1 - 2*h, a2 + 1,
0 - 2*h*B}; (*используя каревое увловие B обнуляем коээфициент \
при yn+1*)
(*поиск решения системы методом прогонки, приводим к виду ci yi +
yi+1 = di*)
CD = Array[c, {n, 2}];
CD[[1, 1]] = m1 - s*k1/r;
CD[[1, 2]] = f1 - (2*h*A + a11*f1)*k1/r;
For [i = 2, i < n, i++,
c11 = M[[i, 1]] - M[[i, 2]]/CD[[i - 1, 1]];
c12 = M[[i, 3]] - CD[[i - 1, 2]]*M[[i, 2]]/CD[[i - 1, 1]];
CD[[i]] = {c11, c12};
];
(*Print[N[M[[n,3]]-2*h*B-CD[[n-1,2]]*(M[[n,2]]+1)/CD[[n-1,1]],10]];*)
v = M[[n, 3]] - 2*h*B -
CD[[n - 1, 2]]*(M[[n, 2]] + 1)/CD[[n - 1, 1]];
u = M[[n, 1]] - 2*h - (M[[n, 2]] + 1)/CD[[n - 1, 1]];
(*Print[CD//MatrixForm]*)
(*Конец приямой прогонки, начинается вычисление неивестных*)
Y = Array[c, n + 1];
Y[[n]] = v/u;
For[i = n - 1, i > 0, i--,
Y[[i]] = (CD[[i, 2]] - Y[[i + 1]])/CD[[i, 1]];
];
Y[[n + 1]] = (2*h*A + f1*a11 - s*Y[[1]])/r;
For[i = 2, i < n + 2, i++,
a1 = Y[[i - 1]];
OTV[[i]] = a1;
];
OTV[[1]] = Y[[n + 1]];
(*Вывод ответа и проверка на правильность*)
Print["Ответ:"];
(*Print[N[Y//MatrixForm,5]] ; *)
Print[N[OTV // MatrixForm, 5]];
Prov = Array[с, n];
For [i = 2, i < n, i++,
pr = Y[[i + 1]] + M[[i, 1]]*Y[[i]] + M[[i, 2]]*Y[[i - 1]] -
M[[i, 3]];
Prov[[i]] = pr;
];
Prov[[1]] = Y[[n + 1]]*r + s*Y[[1]] - 2*h*A - f1*a11;
Prov[[n]] = (M[[n, 2]] + 1)*Y[[n - 1]] + (M[[n, 1]] - 2*h)*Y[[n]] -
M[[n, 3]] + 2*h*B;
(*pr=Y[[n+1]]*r+s*Y[[1]]-2*h*A-f1*a11;*)
(*pr=(M[[n,2]]+1)*Y[[n-1]]+(M[[n,1]]-2*h)*Y[[n]]-M[[n,3]]+2*h*B;*)
(*pr=CD[[3,2]]-M[[3,3]]+CD[[2,2]]*M[[3,2]]/CD[[2,1]]; *)
(*pr=(2*h-3*a11)*Y[[n+1]]+4*a11*Y[[1]]-a11*Y[[2]]-2*h*A; *)
(*pr=Y[[3]]+M[[2,1]]*Y[[2]]+M[[2,2]]*Y[[1]]-M[[2,3]];*)
(*Print["Проверка:"];
Print[N[Prov//MatrixForm,5]]; *)
)
Алгоритм, по которому я писала программу находится
в даной методичке