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

26
F[0]=dx*exp(-a*T[t]);
// правые граничные условия
A[(int)nxbase]=-1;
B[(int)nxbase]=1;
C[(int)nxbase]=0;
F[(int)nxbase]=-dx*exp(-a*T[t]);
// вызов функции прогонки
tdma_h(A,B,C,F,x,nx);
for(i=0; i<nx; i++){
U[t][i]=x[i];
}
}
/*
//расчет в цикле всей поверхности:
for(t=0; t<nt-1; t++){
for(i=1; i<nx-1; i++){
U[t+1][i]=U[t][i]+dt/dx/dx*a*
(U[t][i+1]-2*U[t][i]+U[t][i-1]);//////+++
}
U[t+1][0]=U[t+1][1]-dx*exp(-a*T[t+1]);////////+++
U[t+1][(int)nx-1]=U[t+1][(int)nx-2]-
dx*exp(-a*T[t+1]);
}
//аналитическое решение:
double** U_an = new double*[(int)nt];
for ( i = 0; i < nt; i++) {
U_an[i] = new double[(int)nx];
}
for(t=0; t<nt; t++){
for(i=0; i<nx; i++){
U_an[t][i]=exp(-a*T[t])*sin(X[i]);
}
}
//среднеквадратическая погрешность:
double error,er1=0,er2=0;
for(t=0; t<nt; t++){
for(i=0; i<nx; i++){
er1=er1+pow(U[t][i]-U_an[t][i],2.0);
er2=er2+pow(U[t][i],2.0);
}
}
error=pow(er1/er2,0.5);
// проверка условия сходимости
bool UslShod=2*a*dt/pow(dx,2.0) < 1;
1...,18,19,20,21,22,23,24,25,26,27 29,30,31,32,33,34,35,36,37,38,...52
Powered by FlippingBook