Вычислительные методы в механике и теплофизике: учебный научно-исследовательский практикум

Скачать в pdf «Вычислительные методы в механике и теплофизике: учебный научно-исследовательский практикум»


}


// Реализация метода Эйлера 2-го порядка bool CDifEqn::Euler2Order() {


if((Points<2) || (Dx<Eps*100)) return false; pX[0]=X0; pY[0]=Y0; double Dx_2=Dx*0.5; for(int i=1; i<Points; i++) { pX[i]=X0+i*Dx;


double yMid=pY[i-1]+RPart(pX[i-1], pY[i-1])*Dx_2; double xMid=pX[i-1]+Dx_2; pY[i]=pY[i-1]+RPart(xMid, yMid)*Dx;


Last=i;


if(!CanContinue(i)) { // ой-ой-ой — расчет-то развалился! for(int j=i+1; j<Points; j++) pX[j]=pY[j]=0; return false;


}


}


return true;


}


// Реализация модифицированного метода Эйлера 2-го порядка // с автоматическим выбором шага bool CDifEqn::Euler2Modif() {


if((Points<2) || (Dx<Eps*100)) return false; pX[0]=X0; pY[0]=Y0;


double xStep=Dx;    // сохранить начальное значение шага


int nDivStepCount=0; for(int i=1; i<Points; i++) { double yOld=pY[i-1]; double xOld=pX[i-1]; pX[i]=X0+i*xStep; while (1) {


//—-расчет с текущим шагом по методу второго порядка


double yMid=yOld+RPart(xOld, yOld)*Dx*0.5;


double xMid=xOld+Dx*0.5;


double yOne=yOld+RPart(xMid, yMid)*Dx;


//—-расчет с половинным шагом


double Dx2=Dx*0.5;


//—первый полушаг:


yMid=yOld+RPart(xOld, yOld)*Dx2*0.5; xMid=xOld+Dx2*0.5;


double yTmp=yOld+RPart(xMid, yMid)*Dx2; double xTmp=xOld+Dx2;


//—второй полушаг


yMid=yTmp+RPart(xTmp, yTmp)*Dx2*0.5; xMid=xTmp+Dx2*0.5;


double yTwo=yTmp+RPart(xMid, yMid)*Dx2; double xTwo=xTmp+Dx2;


//—сравнение результатов интегрирования


double EpsStep=fabs(yTwo-yOne); if( (EpsStep<=Eps*100) || (nDivStepCount>=5) ) { xOld=xTwo; yOld=yTwo;


if((EpsStep<Eps) && (nDivStepCount>0)) { // все хорошо ? if(!(—nDivStepCount)) Dx=xStep; // да -> можно else Dx*=2;    // увеличить шаг


}


if(xTwo>pX[i]-Eps) { pY[i]=yTwo; pX[i]=xTwo;


break; // пора заканчивать очередной шаг!


}


}


else if(nDivStepCount<5) {    // 1:32 начального шага разрешена


Dx*=0.5; nDivStepCount++; // все плохо -> уменьшаем шаг


}


} // while Last=i;


if(!CanContinue(i)) { // ой-ой-ой — расчет-то развалился! for(int j=i+1; j<Points; j++) pX[j]=pY[j]=0;


Dx=xStep; // восстановить первоначальный шаг return false;

Скачать в pdf «Вычислительные методы в механике и теплофизике: учебный научно-исследовательский практикум»