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

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 экз. Заказ №

______________________________________________________________________________________________