Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
NMM_Manual_N10.doc
Скачиваний:
9
Добавлен:
27.10.2018
Размер:
637.95 Кб
Скачать

Постановка задачи

Пусть исследуемая функция либо имеет достаточно сложный функциональный вид, затрудняющий определение производной , либо представляет собой некоторый численный алгоритм без функционального вида вообще.

Необходимо выяснить, имеет ли данная функция на заданном интервале точки экстремума , и если имеет – определить эти точки и значения функции в них.

Для выполнения данного задания заменить функцию системой квадратичных сплайнов, пользуясь методикой, изложенной выше.

Поиск экстремумов функции необходимо производить по следующей схеме. Если на частичном отрезке интерполирования квадратичный сплайн имеет экстремум в точке , то и исследуемая функция имеет экстремум в этой точке.

Поскольку сплайн – квадратичный, то он имеет единственную точку экстремума, абсцисса которой равна:

. (10.9)

Для нас будет важен тот случай, когда эта точка окажется внутри частичного интервала, на котором определен данный сплайн, т.е. . В противном случае, когда , либо когда , данная точка как точка экстремума для нами рассматриваться не будет.

В качестве исследуемой функции взять зависимость из лабораторной работы № 3. Произвести вычисления для различных случаев разбиения общего интервала интерполирования. Например, при и т.д., пока количество точек экстремума, определяемых Вашей программой не стабилизируется.

Пример выполнения лабораторного задания на Fortran

Воспользуемся уже разработанными компонентами из лабораторных работ № 3 и № 5, а в качестве исследуемой функции возьмем зависимость

. (10.10)

Стартуем среду разработки MS Visual Studio. Создадим новый проект LabTask_10f и сгенерируем в нем файл основной программной единицы – main_10.f90.

Пользуясь «Проводником», скопируем файлы, содержащие коды исследуемой функции (ЛР № 3) и метода Гаусса (ЛР № 5) в директорию проекта LabTask_10f и включим их в этот проект.

В данной лабораторной работе при решении СЛАУ нам не требуется вычислять determinant –определитель матрицы коэффициентов, поэтому мы удалим код, в котором он используется в процедуре Method_Gaussa() , а саму процедуру переименуем – SLAY ( n, A1, B1, X ).

Приступим к формированию файла модуля mod_10 для данной лабораторной работы – разместим в нем соответствующие интерфейсы и добавим в него описание нового типа (структуры) – spline, который мы будем использовать при организации данных, моделирующих программным путем квадратичные сплайны. Смысл записей данной структуры очевиден. Коэффициенты сплайна обозначены через a, b, c, а поля xn и xk предназначены для «хранения» координат концов частичного отрезка , на котором этот сплайн определен.

Ниже приведен код основной программы, с которым Вам необходимо разобраться самостоятельно:

В отличие от предыдущих лабораторных работ, здесь мы используем статические массивы.

Поэтому для выполнения вычислений с различными значениями параметра N нам придется перекомпилировать программу. Такая схема работы, как правило, используется при отладке новых программ. Выполнение данного кода для N = 100 дает:

Если же задать N = 200 и запустить программу на выполнение возникнет аварийный останов со следующим сообщением:

Причина программного прерывания – переполнение стека буферных операций. Оператор, вызвавший это прерывание, находится в строке 16 основной программы. Задание нулевых значений массиву array производится посредством буфера, размещенного в оперативной памяти (в стеке вызовов операторов ввода/вывода). По умолчанию его объем не превышает 1 МБ.

Мы не будем изменять код программы, а изменим свойства данного проекта и зададим новое значение для объема памяти, выделяемой под стек.

Откроем контекстное меню «Properties» для проекта LabTask_10f.

Откроем в нем пункт «Linker» и перейдем на подпункт «System». Затем, в таблице непосредственных свойств напротив свойства «Stack Reserve Size» зададим количество байт, которое мы посчитаем достаточным для нормальной работы программы, например, 16 МБ. Это число необходимо предварительно корректно вычислить при помощи стандартного калькулятора.

Перекомпилируем программу и запустим ее на выполнение при N = 200 и N = 300:

Сопоставление полученных результатов свидетельствует о том, что цель лабораторной работы достигнута – определены (с достаточной степенью точности) точки экстремума таблично заданной функции. Очевидно, что для более убедительного сравнения точек экстремума, полученных путем интерполирования сплайнами, с их точными значениями, необходимо выбирать тестовую функцию простого вида, например, или . Рекомендуем выполнить такой анализ самостоятельно для различных значений параметра .

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]