- •Вычислительная математика
- •Москва 2008
- •Cодержание
- •1. Цель курсовой работы
- •2. Задание на курсовую работу
- •3. Этапы выполнения курсовой работы
- •4. Методические указания
- •5. Варианты заданий для курсовой работы
- •6. Примеры реализации отдельных программ и их фрагментов
- •Гоу впо “Московский государственный университет приборостроения и информатики”
- •107996, Москва, ул. Стромынка, 20
6. Примеры реализации отдельных программ и их фрагментов
Ниже приведен исходный код программной реализации на языке С++ для решения СЛАУ методом Гаусса с выбором ведущего элемента.
#include <algorithm>
#include <cmath>
#include <cstdlib>
int main(int argc, char* argv[])
{
// Решение СЛАУ методом Гаусса с выбором главного элемента по столбцам.
// Задание исходных данных.
// Размерность системы
const int n = 2;
// Матрица системы
double A[n][n] = {{1, 1}, {2, -1}};
// Вектор правой части
double b[n] = {1, 2};
// Решение
double x[n];
using namespace std;
/* Приведение матрицы A к верхней треугольной матрице с единицами на главной
диагонали */
for (int i = 0; i < n; i++) {
// Номер строки, содержащей главный элемент
int maxElementRow = i;
// Поиск главного элемента
for (int k = i+1; k < n; k++) {
if (abs(A[k][i]) > abs(A[maxElementRow][i]))
maxElementRow = i;
}
// Перестановка строк с номерами i, maxElementRow
if (maxElementRow != i) {
for (int j = i; j < n; j++)
swap(A[i][j], A[maxElementRow][j]);
}
double l = A[i][i];
for (int j = i; j < n; j++)
A[i][j] /= l;
b[i] /= l;
for (int k = i+1; k < n; k++) {
double l = A[k][i];
for (int j = i; j < n; j++)
A[k][j] -= A[i][j] * l;
b[k] -= b[i] * l;
}
}
// Обратный ход. Вычисление решения
for (int i = n-1; i >= 0; i--) {
x[i] = b[i];
for (int j = n-1; j > i; j--)
x[i] -= A[i][j] * x[j];
}
return 0;
}
Далее представлен фрагмент программы для численного интегрирования методом парабол с автоматическим выбором шага интегрирования. Фрагмент вычисления интеграла реализован в виде функции integral(), для задания подинтегральной функции использован указатель на подинтегральную функцию.
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
/* Функция нахождения интеграла
Параметры: function - указатель на подынтегральную функцию;
lowerLimit, upperLimit - нижний и верхний пределы соответственно;
eps - точность */
double integral(double(*function)(double), double lowerLimit,
double upperLimit, double eps) {
const int MAX_ITERATIONS = 1000;
double I1, I2, FL, FR, F1, F2, h;
// FL - значение подынтегральной функции на левом конце отрезка
// FR - значение подынтегральной функции на правом конце отрезка
// F1 - сумма значений подынтегральной функции Fi с нечетными i (кроме значений функции
// на концах отрезка)
// F2 - сумма значений подынтегральной функции Fi с четными i (кроме значений функции
// на концах отрезка)
unsigned int i, k = 1, n = 4;
// k - номер текущей итерации
// n - число разбиений
FL = function(lowerLimit);
FR = function(upperLimit);
F1 = 0;
F2 = 0;
h = (upperLimit - lowerLimit) / n;
for (i = 0; i < n / 2; i++)
F1 += function(lowerLimit + (2*i+1)*h);
for (i = 1; i < n / 2; i++)
F2 += function(lowerLimit + (2*i)*h);
I2 = (FL + 4*F1 + 2*F2 + FR) * ((upperLimit - lowerLimit) / (3*n));
do {
if (k > MAX_ITERATIONS) {
/* Выброс исключения при невозможности достичь заданной точности
при числе итераций, не превышающем MAX_ITERATIONS */
throw -1;
}
k++;
n *= 2;
F2 = F1 + F2;
h /= 2;
F1 = 0;
for (i = 0; i < n / 2; i++)
F1 += function(lowerLimit + (2*i+1)*h);
I1 = I2;
I2 = ((FL + 4*F1 + 2*F2 + FR) * (upperLimit - lowerLimit)) / (3*n);
} while (abs(I2 - I1) > eps);
return I2;
}
Список литературы
1) Вержбицкий В.М. Основы численных методов: Учебник для вузов. 2-е изд. Перераб. – М.: Высшая школа, 2005. – 840 с.
2) Каханер Д., Моулер К., Неш С. Численные методы и программное обеспечение. – М.: Мир, 2001 – 575c.
3) Страуструп Б. Язык программирования С++. Специальное издание. Пер. с англ. – М.: ООО «Бином - Пресс», 2007 г. – 1104 с.:ил.
4) Самарский А.А., Гулин А.В. Численные методы: Учебное пособие для вузов. – М.: Наука, 1989. – 432 с.
5) Шилдт Г. Самоучитель С++. Пер. с англ. – 3-е изд. – СПб.: БХВ – Петербург, 2005 – 688 с.
Учебное издание
А.Е. Александров
Вычислительная математика
Учебно-методическое пособие по курсовому проектированию
______________________________________________________________________________________________
Подписано в печать
Формат 60x84 1/16
Объем п.л. Тираж 100 экз. Заказ №
______________________________________________________________________________________________