- •Соглашения
- •Общие замечания
- •Порядок выполнения первого задания
- •Общий порядок выполнения очередного (не первого) задания
- •Признак успешности выполнения алгоритма
- •Практическое задание №1. Метод половинного деления
- •Методические указания
- •Порядок выполнения задания
- •Варианты решаемых функций
- •Практическое задание №2. Метод простых итераций
- •Методические указания
- •Порядок выполнения задания
- •Варианты решаемых функций
- •Практическое задание №3. Метод Ньютона
- •Методические указания
- •Порядок выполнения задания
- •Варианты решаемых функций
Вычислительная математика. Практикум
Соглашения
В документе используются следующая терминология и сокращения:
MSVS2008 — среда разработки Microsoft Visual Studio 2008 (допускает-
ся также среда года выпуска 2010).
Решаемая функция — функция, решение которой необходимо найти. Функция метода — функция, в пределах которой реализуется задан-
ный метод решения решаемой функции. Основной модуль — модуль основной функции.
Общие замечания
Программирование осуществляется в среде MSVS2008. Программы пишутся на языке программирования C (C++). Все задания выполняются в одном решении (solution в терминологии Microsoft Visual Studio), при этом каждый исследуемый метод выполняется в отдельном модуле (отдельном файле) типа .h (заголовочный), название которого будет задано преподавателем явно.
Каждый метод описывается в виде отдельной функции (функции метода), название которой задает преподаватель, в указанном выше файле. Функция метода имеет параметры, определяемые заданием.
Основная функция main описывается в модуле, который будет создан мастером MSVS2008.
Текст программ должен соответствовать требованиям ТПМ1 с точностью до пробела, со следующими ограничениями:
-каждый модуль должен иметь файловый комментарий;
-основная функция должна иметь комментарий «Основная функция»;
-решаемая функция должна иметь комментарий «Решаемая функция метода название метода»;
-функция метода имеет многострочный комментарий:
Метод название метода (e.g. «Метод деления отрезка пополам») Аргументы:
описание первого аргумента описание второго аргумента
. . .
. . .
-другие комментарии — по желания программиста;
-скобка, открывающая тело функции, должна располагаться в первой строке этой функции, например:
1 См., например, «Вл. Пономарев. ТПМ. Требования к программным модулям. Методические указания. Ред. 1. Озерск: ОТИ МИФИ, 2006. — 40 с.».
1
double foo(double x) {
/* код тела функции */
}
Если задание предусматривает одновременное решение разными способами, каждый отдельный способ описывается функцией, заданное название которой заканчивается цифрой, обозначающей порядковый номер способа, например, half1, half2 … (при этом неявно предполагается, что количество способов реализации метода не должно превышать девяти).
Порядок выполнения первого задания
1)Откройте MSVS2008
2)На вкладке Start Page выберите Create Project
3)В диалоге New Project в списке Project types выберите Visual C++ —
Win32
4)В диалоге New Project в списке Templates выберите Win32 Console Application
5)В поле Name введите VM1 (вычислительная математика 1 курс)
6)В поле Location введите C:\ 2
7)Нажмите кнопку OK
8)Нажмите кнопку Finish
9)Появится проект и основная функция примерно следующего вида:
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Замените описание основной функции следующим:
/* Основная функция */ void _tmain() {
}
10) Замените файловый комментарий основного модуля на, например, следующий:
/* Файл VM1.cpp |
*/ |
/* ОТИ НИЯУ МИФИ |
*/ |
/* 1ПО-XXД |
*/ |
/* Пономарев Владимир Вадимович |
*/ |
/* Вычислительная математика |
*/ |
/* Программа VM1 |
*/ |
/* Основной модуль |
*/ |
/* 20.02.2013 |
*/ |
2 Вы можете также использовать имя диска вашего личного сменного носителя информации, однако помните, что ресурс числа записей на него может быть ограничен, а сам диск может быть недоступен во время сеанса работы некоторое время по разным причинам.
2
11)Скомпилируйте проект, нажав сочетание клавиш Ctrl+Shift+B. Убедитесь, что проект не содержит ошибок, при необходимости устраните их.
12)Следуйте методическим указаниям и порядку выполнения задания практического задания №1.
13)Выполнив задание, убедитесь, что преподаватель начислил Вам необходимое количество баллов.
14)Сохраните решение (проект) с диска C: на ваш личный сменный носитель информации 3.
Общий порядок выполнения очередного (не первого) задания
1)Скопируйте решение (проект) с вашего личного сменного носителя информации на диск C: (см. также сноску 2), откройте его.
2)Следуйте методическим указаниям и порядку выполнения задания соответствующего практического задания.
3)Выполнив задание, убедитесь, что преподаватель начислил Вам необходимое количество баллов.
4)Сохраните решение (проект) с диска C: на ваш личный сменный носитель информации (см. также сноску 3).
Примечание. Во время выполнения задания периодически (примерно каждые 10 секунд) сохраняйте работу (например, нажимая сочетание клавиш Ctrl+S). После выполнения каждой отдельной законченной части работы проверяйте синтаксическую правильность вашей программы, компилируя ее (например, нажимая сочетание клавиш Ctrl+Shift+B).
Признак успешности выполнения алгоритма
Функция метода последним аргументом должна возвращать признак успешности выполнения алгоритма, название аргумента — success, параметр передается через указатель, используется тип int*.
Этот признак можно использовать различными способами.
1) Если возвращается нулевое значение success, алгоритм, например, зациклился, а если возвращается ненулевое значение, то считается, что алгоритм завершился успешно.
Для формирования такого способа идентификации успешности внутри функции метода должен быть сформирован счетчик числа итераций, название счетчика — cyclecount. Начальное значение этого счетчика задается равным нулю, а в каждой итерации цикла алгоритма счетчик инкрементируется (то есть увеличивается на единицу).
Если в какой-то момент значение счетчика достигает максимально допустимого числа итераций, название константы — MAX_CYCLE_COUNT, то алгоритм завершает свою работу с установкой признака успешного выполнения success в нулевое значение. Если по ходу выполнения алгоритма
3 Если вы использовали диск вашего личного сменного носителя информации, этот пункт не требует выполнения.
3
максимальное значение счетчика достигнуто не было, то алгоритм должен установить значение признака успешного выполнения success в единичное значение, например:
double method(..., int* success) { *success = 0;
int cyclecount = 0; double X = 0;
// рабочий цикл алгоритма while ( 1 ) {
if (cyclecount++ > MAX_CYCLE_COUNT) break; // алгоритм
*success = 1;
}
return X;
}
Здесь три подряд идущих точки обозначают другие аргументы функции метода (они разные для разных методов).
2) Признак успешного выполнения алгоритма на самом деле возвращает число выполненных итераций.
В этом случае в начале алгоритма задается начальное значение аргумента success, равное нулю:
double method(..., int* success) { *success = 0;
}
Далее в каждой итерации цикла значение success увеличивается на единицу (признак считает итерации), например:
double method(..., int* success) { *success = 0;
// рабочий цикл алгоритма while ( 1 ) {
(*success)++;
}
}
Если в какой-то момент времени значение признака достигнет максимального числа циклов, упомянутого выше в п.п. 1), алгоритм завершается, например:
double method(..., int* success) { *success = 0;
double X = 0;
// рабочий цикл алгоритма while ( 1 ) {
if ((*success)++ > MAX_CYCLE_COUNT) break;
}
return X;
}
4
В случае, если возвращается признак, равный нулю, алгоритм не выполнил ни одной итерации. Если число итераций равно 1, либо точное попадание на первой итерации, либо что-то неправильно в алгоритме. Если число итераций равно или превышает значение максимального числа итераций, алгоритм зациклился. В других случаях считается, что алгоритм завершился успешно, а признак успешности success показывает число итераций, что позволяет оценить алгоритм.
Оба способа формирования признака успешности обладают своими достоинствами и недостатками, однако более предпочтительным представляется метод 2).
После вызова функции метода вы можете использовать условный оператор, чтобы определить, выполнился ли алгоритм успешно, например:
void _tmain() {
int success = 0; double result = 0.0;
result = method(..., &success); if (success == 0) {
//неуспешно
printf("Failure\n");
}else {
//успешно
printf("SUCCESS=%d", success); printf("EPSILON=%0.3lfd", EPS); printf("RESULT0=%0.3lf", result);
}
}
Более предпочтительным представляется просто вывод всех результатов работы алгоритма без анализа признака успешности (однако в этом случае необходимо визуально контролировать признак) например:
void _tmain() {
int success = 0; double result = 0.0;
result = method(..., &success); printf("SUCCESS=%d", success); printf("EPSILON=%0.3lfd", EPS); printf("RESULT0=%0.3lf", result);
}
Наилучшим способом является комбинация описанных методов. При этом функция метода возвращает также, помимо признака успешности, счетчик итераций iteration. Определение функции метода должно иметь на один аргумент больше, чем описано в задании, например:
double method(..., int* success, int* iteration) {
}
Внутри функции метода при этом используются приемы работы с аргументами success и iteration, описанные выше.
5