Реализации алгоритмов/Метод прогонки
(перенаправлено с «Программные реализации метода прогонки»)
/* n - число уравнений (строк матрицы)
* b - диагональ, лежащая над главной (нумеруется: [0;n-1], b[n-1]=0)
* c - главная диагональ матрицы A (нумеруется: [0;n-1])
* a - диагональ, лежащая под главной (нумеруется: [0;n-1], a[0]=0)
* f - правая часть (столбец) (нумеруется: [0;n-1])
* x - решение, массив x будет содержать ответ (нумеруется: [0;n-1])
*/
void solveMatrix (int n, double *a, double *c, double *b, double *f, double *x)
{
double m;
for (int i = 1; i < n-1; i++)
{
m = a[i]/c[i-1];
c[i] = c[i] - m*b[i-1];
f[i] = f[i] - m*f[i-1];
}
x[n-1] = f[n-1]/c[n-1];
for (int i = n - 2; i >= 0; i--)
{
x[i]=(f[i]-b[i]*x[i+1])/c[i];
}
}
def TDMA(a,b,c,f):
a, b, c, f = tuple(map(lambda k_list: list(map(float, k_list)), (a, b, c, f)))
alpha = [-b[0] / c[0]]
beta = [f[0] / c[0]]
n = len(f)
x = [0]*n
for i in range(1, n):
alpha.append(-b[i]/(a[i]*alpha[i-1] + c[i]))
beta.append((f[i] - a[i]*beta[i-1])/(a[i]*alpha[i-1] + c[i]))
x[n-1] = beta[n - 1]
for i in range(n - 1, 0, -1):
x[i - 1] = alpha[i - 1]*x[i] + beta[i - 1]
return x