Язык С++ как инструмент моделирования на основе решения дифференциальных уравнений в частных производных - page 21

19
void tdma_h(double* A,
double* B,
double* C,
double* F,
double* x, int nxbase){
double *alfa= new double[(int)nxbase];
double *betta= new double[(int)nxbase];
alfa[0]=-C[0]/B[0];
betta[0]=F[0]/B[0];
int i;
for(i=1; i<nxbase-1; i++){
alfa[i]=-A[i]/(B[i]+C[i]*alfa[i-1]);
betta[i]=(F[i]-C[i]*betta[i-1])/
(B[i]+C[i]*alfa[i-1]);
}
betta[nxbase-1]=(F[nxbase-1]-A[nxbase-1]*
betta[nxbase-2])/(B[nxbase-1]+A[nxbase-1]*
alfa[nxbase-2]);
x[nxbase-1]=betta[nxbase-1];
for(i=nxbase-2; i>=0; i--){
x[i]=alfa[i]*x[i+1]+betta[i];
}
}
Основной цикл алгоритма решения рассматриваемой задачи (1.1)-
(1.4) на основе ее конечно-разностного представления начального
условия,
неявной
схемы
для
дифференциального
уравнения
параболического типа (1.10) с начальным условием (1.4) и трехточечной
аппроксимации граничных условий со вторым порядком точности по
координате.
for(t=1; t<nt; t++){
for(i=1; i<nxbase; i++){
A[i]=-Koeff;
B[i]=1+2*Koeff;
C[i]=-Koeff;
F[i]=U[t-1][i];
}
// левые граничные условия
A[0]=0;
B[0]=-2*Koeff;
C[0]=2*Koeff-1;
F[0]=2*Koeff*dx*exp(-a*T[t])-U[t-1][1];
// правые граничные условия
A[(int)nxbase]=2*Koeff-1;
B[(int)nxbase]=-2*Koeff;
C[(int)nxbase]=0;
F[(int)nxbase]=2*Koeff*dx*exp(-a*T[t])-
U[t-1][1];
1...,11,12,13,14,15,16,17,18,19,20 22,23,24,25,26,27,28,29,30,31,...52
Powered by FlippingBook