function [ResList,WorkList,NStep] = eqsol0(X,delta) // // Простейший интервальный алгоритм решения уравнения вида ff(x) = 0 // // Входные параметры: // X - исходный интервал, на котором ищутся решения уравнения // delta - ограничение на размер выходных интервалов // // Выходные параметры: // ResList - список результирующих интервалов // WorkList - список "недообработанных" интервалов // NStep - количество шагов, сделанных алгоритмом // //////////////////////////////////////////////////////////////////////////////// MaxStepNumber = 400; // ограничение на количество итераций алгоритма //////////////////////////////////////////////////////////////////////////////// // // задание функции ff, фигурирующей в уравнении // function Y = ff(X) // Y = X*X - sin(X) - 1.; Y = X*X + 4*cos(X) - 4.; endfunction //////////////////////////////////////////////////////////////////////////////// // // "обынтерваливаем", на всякий случай, введённые данные // X = interval(X); //////////////////////////////////////////////////////////////////////////////// // // запускаем собственно интервальный алгоритм решения уравнения // сначала инициализируем счётчик числа шагов NStep = 0; // инициализируем рабочий список WorkList исходным интервалом X, // а список ответов ResList делаем пустым WorkList = X; ResList = []; while ( ~isempty(WorkList) & NStep < MaxStepNumber ) // увеличиваем счётчик шагов NStep = NStep + 1; // извлекаем из рабочего списка брус Y, // вычисляем для него интервальную оценку области значений Y = WorkList(1); Z = ff(Y); // если интервальная оценка Z содержит нуль, // выполняем дальнейшую обработку соответствующего интервала if in(0,Z) then if width(Y) < delta then // если ширина интервала Y меньше допуска delta, // заносим Y в список ответов ResList ResList = [ ResList, Y ]; else // иначе дробим интервал Y пополам на потомки D1 и D2 D1 = interval( inf(Y), mid(Y) ); D2 = interval( mid(Y), sup(Y) ); // помещаем потомки в рабочий список WorkList WorkList = [ WorkList, D1 ]; WorkList = [ WorkList, D2 ]; end end // удаляем из рабочего списка бывший первый интервал WorkList(1) = []; end endfunction ////////////////////////////////////////////////////////////////////////////////