hi, all
процедура изменения шага выглядит следующим образом (хотя практически идентичны):
1. если новая предполагаемая длина шага h увеличивается менее, чем в 1.1, то шаг не меняем.
2. шаг не меняем в течении k+1 шагов после последнего изменения, если только используемое значение шага обеспечивает точность eMax.
3. если после k+1 шагов увеличение шага невозможно, то дальнейшая проверка возможности увеличения шага откладывается до 10 шагов.
double a;// параметр изменения шага
int CounterSuccess=0;//счетчик удачных вычислений
while (.......) // основной цикл вычислений
{
ReCalculation:
x=x+h;
if (FlagReCalculation==true)
{
.........................
FlagReCalculation=false;
}
........................................
// блок управления шагом и порядком
if (eT>eMax) {// с текущим шагом h точность eMax не достигнута
Comput_a(); //вычисляю a, которое должно быть меньше 1
x=x-h; // возвращаюсь в предыдушую точку
h=h*a; //уменьшаю шаг, будет ли достаточным такое уменьшение, чтобы
// на следующей итерации удовлетворялось уравнение (eT<=eMax) еще нужно проверить
CounterSuccess=0; //счетчик удачных вычислений обнуляю
FlagReCalculation=true;
goto ReCalculation; // иду вверх и все пересчитываю с новым h (меньшим шагом)
}
else { // с текущим шагом h точность eMax достигнута
if (CounterSuccess>kCurrent+1) {
Comput_a(); //вычисляю a, которое должно быть больше 1
if (a>1.1) {
h=h*a; //увеличиваю шаг
ChangeOrder(); // если нужно, то меняю порядок метода
CounterSuccess=0; //т.к. шаг поменял
}
else CounterSuccess=CounterSuccess-10-1;// откладываем проверку на 10 шагов, и еще вычитаем 1, т.к. 3 строки ниже увеличиваю счетчик
}
}
CounterSuccess++;//счетчик удачных вычислений <------------
.......................
} // while
вот что набросал, но как — то не укладывается в голове третье условие в процедуре изменения шага и моя проверка
else CounterSuccess=CounterSuccess-10-1;//