Реализации алгоритмов/Метод прогонки
Внешний вид
(перенаправлено с «Программные реализации метода прогонки»)
/* 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];
}
}
https://en.wikipedia.org/wiki/Triagonal_matrix_algorithm
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
'N - chislo uravnenij (strok matricy)
'C - diagonal sprava ot glavnoj ([0;N-1], C[N-1]=0)
'B - glavnaja diagonal matricy A ([0;N-1])
'A - diagonal sleva ot glavnoj ([0;N-1]. A[0]=0)
'F - pravaja chastx (stolbec) ([0;N-1])
'X - reshenie, massiv X sodergit otvet ([0;N])
CLS
COLOR 10
'DATA 3
'DATA 0.24, -0.15, 0.0
'DATA 4.00, 3.00, 4.08
'DATA 0.0 , 0.09, -0.08
'DATA 8 , 9 , 20
'X[0]=1.808361, X[1]=3.193979, X[2]=4.964588
DATA 4
DATA 0.0475, 0.0523, 0.0570, 0.0
DATA 10.8000, 9.9000, 9.0000, 8.1000
DATA 0.0 , 0.0321, 0.0369, 0.0416
DATA 12.1430, 13.0897, 13.6744, 13.8972
'X[0]=1.118588, X[1]=1.310624, X[2]=1.503187, X[3]=1.707984
PRINT "Reshenie SLAU s trigonalxnoy matricey metidom progonki"
DEFINT N
DEFDBL C,B,A,F,X,M
READ N
DIM C[N-1],B[N-1],A[N-1],F[N-1],X[N]
'1. Vvod
PRINT "Input data"
FOR I=0 TO N-1
READ C[I]
PRINT USING "##.#### ";C[I];
NEXT I
PRINT "NadDiagonal"
FOR I=0 TO N-1
READ B[I]
PRINT USING "##.#### ";B[I];
NEXT I
PRINT "Diagonal"
FOR I=0 TO N-1
READ A[I]
PRINT USING "##.#### ";A[I];
NEXT I
PRINT "PodDiagonal"
FOR I=0 TO N-1
READ F[I]
PRINT USING "##.#### ";F[I];
NEXT I
PRINT "pravaja chastx (stolbec)"
'2. Progonka
FOR I=1 TO N-1
M=A[I]/B[I-1]
B[I]=B[I]-M*C[I-1]
F[I]=F[I]-M*F[I-1]
NEXT I
'3.Vychislenie X[I] ot N-1 do 0
PRINT "Output data"
FOR I=N-1 TO 0 STEP -1
X[I]=(F[I]-C[I]*X[I+1])/B[I]
PRINT USING "X[##]=##.######";I,X[I]
NEXT I
END