Есть следующая задача: итеративно проаппроксимировать некую дискретно заданную функцию, используя функции Гаусса и Лоренца. Если с гауссом проблем нет, то с Лоренцом возник интересный казус. Суть алгоритма сводится к изменению одного параметра в функции Лоренца, а после сравнению полученного значения с заданной точностью, и, если точность подходит, то обрабатывается следующее число, иначе опять меняется параметр.
Суть проблемы: после определенного количества итераций происходит сравнение
if (a < - eps) then ...
где a = - 0.0010000456..., eps = 0.001.
Процессор справедливо считает, что условие верно, и a < eps, но, с математической точки зрения на задачу, хвост ...456... абсолютно незначителен. При последующих итерациях алгоритма этот хвост только становится меньше, но остается в тех же пределах.
Вопрос: как его отрезать?
Я пробовал менять значение точности, пробовал округлять до следующего знака - все это не работает, так как в таком случае алгоритм просто подгоняет хвост под мое округление. Есть вариант сделать поразрядное сравнение, но я довольно плохо представляю, как корректно разбить число типа Double на массив из Int без танцев с бубном.
Что-то мутное. Что за a - неизвестно, почему такое странное сравнение (не по abs) - непонятно. В целом вопрос бредовый, идея поразрядного сравнения в вычматах и близко не лежала.
longclaps, я надеялся на "простой вопрос - простой ответ"...
Вот код, который это обсчитывает:
static private bool LorenzIteration(int iter)
{
bool flag = false;
phi[iter] = 0;
for (int i = 0; i < count; i++)
{ // a1i*/((a3i^2*(tn-a2i))^2+1)
// Расчет аппроксимирующей функции
f[iter][i] = a1[iter] / (Math.Pow(Math.Pow(a3[iter], 2.0) * (x0[i] - a2[iter]), 2.0) + 1.0);
// Расчет дельты для следующей итерации
del[iter + 1][i] = del[iter][i] - f[iter][i];
// Проверка на отрицательность
if (del[iter + 1][i] < -eps) //(DoubleCompare(del[iter + 1][i], -eps))
{
flag = true;
}
}
return flag;
}
Да, я понимаю, что сравнение, мягко говоря кривое, но я уже плохо помню, как правильно. Если не ошибаюсь, конкретно сравнение должно быть таким: Math.Abs(del[iter + 1][i]) < eps, верно?
Прошу меня простить, сбился. Такое странное сравнение там специально, чтобы менять параметр a3 только в том случае, если рассчитанное число ушло в минус больше, чем на значение точности. Если это не так, то все нормально и можно просто переходить к следующей итерации, a3 менять не нужно.
Денис Печерский, стало еще бредовей. Ну, допустим, a1, a2, a3 - это какие-то начальные условия, а чем инициализируется del[0]? И почему для установки флага достаточно 1 (!) понижения del в произвольной точке на произвольной итерации?
Всё галиматья, идите спать.