Перейти к содержанию

Реализации алгоритмов/Метод прогонки

Материал из Викиучебника — открытых книг для открытого мира
	/* 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