Привет всем!
Решаю одномерное уравнение теплопроводности по неявной схеме методом прогонки, но из-за того, что коэффициент теплопроводности сильно изменяется (от 0,1 до 70) - возникают ошибки во время расчета. У Самарского прочитал, что есть специальный метод потоковой прогонки, который позволяет решать задачи с сильно меняющимся коэффициентом (Самарский Теория Разностных Схем, Дополнение 2 стр. 637). Однако не очень понятно, как переделать существующий метод, чтобы получить метод потоковой прогонки. Вот реализация обычного метода прогонки:
Код:
function MP(A: Matr2; b: Matr1; nodes:integer): Matr1; //Matr2 - матрица, Matr1 - вектор
var i, n: integer;
f, g: Matr1;
begin
n:=nodes-2;//Length(A);
SetLength(f, n-1);
SetLength(g, n-1);
for i:=0 to n-1 do
b[i]:=-1*b[i];
f[0]:=-A[0,1]/A[0,0];
g[0]:=-b[0]/A[0,0];
for i:=1 to n-2 do
begin
f[i]:=-A[i,i+1]/(A[i,i]+A[i,i-1]*f[i-1]);
g[i]:=-(b[i]+A[i,i-1]*g[i-1])/(A[i,i]+A[i,i-1]*f[i-1]);
end;
SetLength(result, n);
result[n-1]:=-(b[n-1]+A[n-1,n-2]*g[n-2])/(A[n-1,n-1]+A[n-1,n-2]*f[n-2]);
for i:=n-2 downto 0 do result[i]:=f[i]*result[i+1]+g[i];
end;