В код совершенно неохота вникать.
Но у вас должен выполняться "принцип максимума": значение во внутренней точке на следующем временном слое является средним из значений на предыдущем (известных) и соседних значений (неизвестных). Что-то типа такого:
где
и все эти коэффициенты положительны.
Надо проверить (отладочным кодом), выполняется ли этот принцип для коэффициентов уравнений (с учётом округлений, нужно проверять с какой-то погрешностью).
Если выполняется, то нужно смотреть уже код решения системы линейных уравнений, для тех внутренних точек, в которых "принцип максимума" нарушается, т.е. значения меньше минимума или больше максимума соседних (участвующих в одном уравнении) — значит для этих значений система решена неверно.
Если и тут всё нормально, то ещё остаётся последняя возможность, что решение начинает портиться с краёв, тогда отдельно на реализацию граничных условий надо обратить внимание.
Дальше я пас.
P.S. Я всё-таки код глянул одним глазком. По-моему, вы напутали с
hx и
hy в коэффициентах
a,
b,
c и
d: в первой системе везде должно быть
hx, а во второй —
hy. Ну или наоборот.