Добрый день, группа 312!

Курс «Практикум на ЭВМ» (по численным методам)

Осенний семестр. Методы решения линейных систем нахождений собственных значений

Я — Максим Александрович Кривчиков

email:

Материалы к занятиям: https://maxxk.github.io/programming-semester-5/

В дисплейных классах рекомендуется просматривать в браузере Firefox.
В нём установлено расширение NoScript, обратите внимание на инструкцию, иначе значительная часть сайтов не будет работать.

Как получить зачёт

Зачёт по теории, письменный, общий (весь курс пишет одновременно).

Для допуска к зачёту нужно сдать решения 3 задач (не считая двух подготовительных на этом занятии).

Каждая последующая задача выдаётся после сдачи предыдущей.

Схема проведения зачётов:

  1. До начала зачётной недели — досрочный теоретический зачёт (для тех, кто сдал все 3 задачи заранее, примерно до середины ноября).
  2. В начале зачётной недели — теоретический зачёт (для тех, кто успел сдать 3 задачи на занятиях).
  3. Два практических зачёта по 1.5 часа. Те, кто не успел сдать задачи за эти два зачёт отправляются на пересдачу.
  4. Во второй половине зачётной недели — второй теоретический зачёт (для тех, кто успел сдать 3 задачи за время практических зачётов).
  5. Пересдача — после каникул, в феврале. Задачи принимает комиссия из нескольких преподавателей кафедры.

Литература

Основной курс со списком вопросов к зачёту:

  • К. Ю. Богачёв. Практикум на ЭВМ. Методы решения линейных систем и нахождения собственных значений.
    («Методы приближения функций» — в следующем семестре)

Материалы по практике:

Как готовить задачи

Разрабатывать и отлаживать можно на своих компьютерах, но сдавать — только на компьютерах в дисплейном классе. Можно приносить задачи на флэшке, лучше всего — через Интернет (отправить себе на почту, сохранить на Яндекс.Диск и т.п.).

В дисплейных классах установлена ОС Fedora 20 со средой рабочего стола KDE. Варианты по получению похожего окружения:

  • Установить Linux (проще всего Ubuntu/Kubuntu), установить туда gcc, gdb.
  • Для Macbook — можно работать в Mac OS X, почти всё будет близко к Linux.
  • Установить Linux в виртуальной машине (компьютер должен иметь >= 8 Gb памяти, можно попробовать Xubuntu с 4).
  • Для Windows — установить Cygwin, для Windows 10 — попытаться установить Windows Subsystem for Linux.

Настройки компилятора

В дисплейных классах установлены специальные настройки компилятора — более строго, чем обычно, контролируется соответствие программ стандарту, кроме того, более широкий класс ошибок приводит к аварийному завершению программы. Как получить близкое поведение на своей машине:

  • Добавить к командной строке флаги:

    gcc -std=c99 -Wall -Werror -Wshadow -pedantic-errors \
    -Wpointer-arith -Waggregate-return \
    -Wstrict-prototypes -Wmissing-declarations \
    -Wlong-long -Winline -Wredundant-decls \
    -Wcast-qual -Wcast-align -D__STRICT_ANSI__
  • Активировать исключения underflow для чисел с плавающей точкой:

    // В начале файла:
    #include <fenv.h>
    // В начале функции main:
    fenableexcept(FE_DIVBYZERO | FE_INVALID
      | FE_OVERFLOW | FE_UNDERFLOW);

Вход в систему

Данные учётной записи для входа я выдам на одном из следующих занятий.

Пока что:

логин:
student
пароль:
mexmat

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

Работа в системе

Для редактирования исходного кода лучше всего использовать:

  • Qt Creator
  • или gedit

В терминале:

  • vim (нужно прочитать хотя бы какое-нибудь руководство)
  • nano (наиболее простой; команды: Ctrl+X — выход, Ctrl+O — сохранение, Ctrl+W — поиск).

Использование терминала

Вызов терминала в дисплейных классах:

Правой кнопкой мыши на рабочем столе ⟶ Konsole

Запуск программы из текущего каталога:

./task-19 test-1.in

Переход между каталогами:

cd ~/task-19

Специальные символы:

  • ~ — домашний каталог (Shift + клавиша слева от 1)
  • .. — переход на один уровень вверх

Вывод содержимого каталога: ls

Сборка программы

Сборка программы из нескольких файлов:

gcc -o task-19 main.c task-19.c

в несколько этапов:

gcc -c -o main.o main.c

gcc -o task-19 main.o task-19.o

Аргументы командной строки для компилятора:

  • -O0, ..., -O3, -Os — уровни оптимизации; сдавать программы, скомпилированные с ключом -O3;
  • -g — запись отладочной информации (для отладки с использованием gdb), при разработке используйте этот ключ;
  • -lm — подключение библиотеки math (для компоновки, последняя команда, если выводятся ошибки о ненайденных символах _sqrt, _fmax, ...)

Работа с файлами

#include <stdio.h>
FILE *f;
f = fopen(fileName, mode); // открыть файл
  • "r" — чтение
  • "w" — запись (если файл уже существует, он будет перезаписан, т.е. его содержмое будет удалено)
  • "a" — добавление в конец файла
    При ошибке f == 0.
fclose(f) // закрыть файл

при ошибке возвращает EOF

Ввод/вывод

Вывод:

printf("x = %e", x) // на экран
fprintf(f, "x = %e", x) // в файл `f`

Чтение: fscanf(f, " %lf ", &x)
возвращает количество успешно считанных аргументов,
EOF при ошибке перед первым аргументом.

Спецификаторы форматирования:

  • %cchar
  • %schar*
  • %dint, long, ...
  • %f — вывод double
  • %lf — ввод double
  • %e — вывод double, экспоненциальная запись, лучше не использовать для scanf

Операции с числами с плавающей точкой

#include <math.h>

Сравнение: a == b — для чисел с плавающей точкой использовать нельзя.

// в начале файла:
#define EPS 1e-16
// в программе: | a - b | < ε
fabs(a - b) < EPS

max(a, b) ⟼ fmax(a, b); min(a, b) ⟼ fmin(a, b) (-std=c99)
\(e^x\)exp(x); ln x ⟼ log(x); \(x^y\)pow(x, y)
sin, cos, tan, asin, acos, atan, sinh, ...

\(\sqrt{x}\)sqrt(x); \(\sqrt{x^2+y^2}\)hypot(x, y)
\(⌈x⌉\)ceil(x); \(⌊x⌋\)floor(x)
$ x · sgn^*(y)$ ⟼ copysign(x, y) (\(sgn^*(0) ≡ 1\))
\(x · y + z ⟼\) fma(x, y ,z) (округляется только результат)
$ y = [x], z = { x } ⟼$ z = modf(x, \&y)

http://en.cppreference.com/w/c/numeric/math

Некоторые английские термины

sequence последовательность
min (minimum), max (maximum)
Fibbonacci, Pell
average среднее
monotonic монотонная
increasing возрастающая
decreasing убывающая
non-increasing, non-decreasing
constant постоянная
element элемент
greater than, less than

next, previous
first, last
number, count количество
arithmetic progression, common difference
geometric progression, common ratio
local, global
equals to
contains, contained
member of

Заключение

В конце занятия нужно выслать исходный код ваших программ мне на электронную почту ()