![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Программы для решения систем линейныхСодержание книги Поиск на нашем сайте
Алгебраических уравнений
Файл GAUSS.CPP.
// Подключение математики: #include <math.h> // Математика подключена. gauss(a,b,x,n) float a[][nmax]; // Исходная матрица коэффицентов:a float b[]; // Правые части float x[]; // Результат (будет получен при решении) int n; // Количество элементов в векторах и размерность матрицы { int i,j,k,imax; int nm1=n-1; // Используется для удобства вместо n, так как // элементы массивов отсчитываются с 0, а не с 1 int err=0; // Начальное значение кода ошибки =0 (т.е. ошибки нет), // перед окончанием функции переменная err передается // в качестве значения функции float amax,t,mi,sum;
// Проверка корректности переменной n и константы nmax // в случае противоречий выход из функции: // endofproc -метка конца функции
if (n<2) { err=2; goto endofproc; } // В матрице <2 элементов if (n>nmax) { err=3; goto endofproc; } // n>реальной размерности =nmax
// Теперь все корректно.
// Далее следует... // Цикл из n-1 шагов, на каждом шаге находится главный элемент и // преобразовывается матрица. // Главный элемент определяется только из очередного столбца, // а не из всей матрицы. // n-й шаг цикла не нужен так как остается один элемент a[n-1][n-1], // который сам по себе главный (рассматривается после цикла).
for (k=0; k<=nm1-1; k++) { // Поиск главного элемента в текущем столбце (k):
for (i=k,amax=0.0; i<=nm1; i++) if (fabs(a[i][k]) > fabs(amax)) amax=a[(imax=i)][k]; // Главный элемент найден. // Если он =0, то ошибка, так как матрица вырождена и выход из функции // (метка endofproc стоит в конце функции): if (amax==0.0) { err=1; goto endofproc; } // Замена строки с найденным главным элементом на строку с номером k for (j=k;j<=nm1;j++) { t=a[imax][j]; a[imax][j]=a[k][j]; a[k][j]=t; } // Строки заменены. // Замена элементов правой части для тех же строк: t=b[imax]; b[imax]=b[k]; b[k]=t; // Заменены. // Определение mi для каждой строки (ниже главной) // и ее преобразование для найденного mi: for (i=k+1;i<=nm1;i++) { mi=-a[i][k]/amax; a[i][k]=0.0; for (j=k+1;j<=nm1;j++) a[i][j]+=a[k][j]*mi; b[i]+=b[k]*mi; } // На текущем шаге k матрица и правые части преобразованы. } // Конец основного цикла (k увеличивается на единицу и все с начала) // Проверка единственного оставшегося (и поэтому главного) элемента // если он=0, то ошибка, так как матрица вырождена и выход из функции if (a[nm1][nm1]==0.0) { err=1; goto endofproc; } // Теперь матрица a и вектор b преобразованы (подготовлены к поиску x)
// Решение полученной системы (обратный ход): for (i=nm1;i>=0;i--) { sum=0.0; for (j=i+1;j<=nm1;j++) sum+=a[i][j]*x[j]; X[i]=(b[i]-sum)/a[i][i]; } // Решение получено. endofproc: // Конец процедуры: метка для аварийного выхода return(err); // Функция будет иметь значение ошибки err }
Файл MITER.CPP.
// Подключение математики: #include <math.h> // Математика подключена. // Функция получения мантиссы и порядка float числа: mantpor(x,mant,por) float *x,*mant; double *por; { int st; st=(int)floor(log10(*x)); *por=pow10(st); *mant=*x/(*por); } // Конец функции mantpor. // Функция, округляющая float число до n разрядов: float round(x,n) float *x; int n; { float xabs,mant,dpown,xr; double por; int signx; if (*x!=0.0) { xabs=fabs(*x); signx=(*x>=0)? 1:-1; mantpor(&xabs,&mant,&por); dpown=pow10(n); xr=signx*(floor(mant*dpown+0.5)/dpown)*por; } else xr=0.0; return (xr); } // Конец функции round. // Функция, решающая приведенную систему методом итераций: miter(a,b,x,n,ntch,it) float a[][nmax]; // Приведенная матрица коэффициентов. float b[]; // Вектор свободных членов. float x[]; // Вектор неизвестных. int n, // Количество элементов в векторах и размерность матрицы. ntch, // Количество знаков после запятой в мантиссе результата, // которые должны остаться после округления. *it; // Количество итераций, потребовавшихся для получения x. { float sum,xst[nmax]; int err=0; // Значение ошибки (сейчас=0, т.е. ее нет) // в конце функции в качестве ее значения возвращается // эта переменная. int nm1=n-1; // Используется вместо n, так как // массивы отсчитываются с 0, а не с 1 int ntchp1=ntch+1; int i,j,tochnok; // Проверка корректности переменной n и константы nmax // в случае противоречий ошибка и выход из функции: // endofproc - метка в конце функции if (n<2) {err=2; goto endofproc;} // В матрице <2 элементов if (n>nmax) {err=3; goto endofproc;} // n>реальной размерности =nmax // Теперь все корректно. // Проверка на корректность количества разрядов мантиссы для округления: // Если n выходит за ограничения, то ошибка и выход из функции: if (! ((0<=ntch)&&(ntch<=6))) {err=1; goto endofproc;} // Проверка закончена. // Проверка соответствия матрицы a условиям сходимости процесса: // По строкам: for (i=0,sum=0.0; (i<=nm1)&&(sum<1.0); i++) for (j=0,sum=0.0; j<=nm1; j++) sum+=fabs(a[i][j]); // По строкам проверено. // Если по строкам не подходит, то по столбцам: if (sum>=1) { // По столбцам: for (j=0,sum=0.0; (j<=nm1)&&(sum<1.0); j++) for (i=0,sum=0.0; i<=nm1;i++) sum+=fabs(a[i][j]); // По столбцам проверено. // Если и по столбцам не подходит, то ошибка и выход из функции:
if (sum>=1) {err=1; goto endofproc;} } // Проверка на сходимость закончена. // Начальная установка массива x (в принципе может быть любая): for (j=0;j<=nm1;j++) x[j]=b[j]; // Закончена. *it=0; // Обнуляется счетчик итераций. // Основной цикл: на каждом шаге находятся новые значения x, // выход при достижении необходимой точности x: do { (*it)++; // Увеличение счетчика итераций. for (j=0;j<=nm1;j++) xst[j]=x[j]; // Запоминает старое x в xst // Получает новые x: for (i=0;i<=nm1;i++) { for (j=0,sum=0.0; j<=nm1; j++) sum+=a[i][j]*xst[j]; X[i]=b[i]+sum; } // Новые значения x получены. // Проверяет отличие нового x от старого, // т. е. точность до ntch+1 знаков мантиссы: for (j=0,tochnok=1; (j<=nm1)&&tochnok; j++) tochnok=(round(&x[j],ntchp1)==round(&xst[j],ntchp1)); // Точность проверена, если все нормально, то tochnok=1 иначе 0 } // Конец тела основного цикла. while (!(tochnok)); // Выход, если достигнута необходимая точность. // Округление найденного x до ntch знаков мантиссы: for (j=0;j<=nm1;j++) x[j]=round(&x[j],ntch); // Округлены. endofproc: // Метка для аварийного выхода в случае ошибок: return (err); // Код ошибки возвращается в качестве значения функции. }
Список литературы
1. Амосов А. А., Дубинский Ю. А., Копченова Н. В. Вычислительные методы для инженеров: Учеб. пособие. - М.: Высш. шк., 1994. 2. Бахвалов Н. С., Жидков Н. П., Кобельков Г. М. Численные методы. - М.: Наука, 1987. 3. Березин И. С., Жидков Н. П. Методы вычислений: В 2-х т.- М.: Наука, 1966. Т.1. 4. Демидович Б. П., Марон И. А. Основы вычислительной математики. - М.: Наука, 1970. 5. Копченова Н. В., Марон И. А. Вычислительная математика в примерах и задачах. - М.: Наука, 1972. 6. Марчук Г. И. Методы вычислительной математики. - М.: Наука, 1989. 7. Плис А. И., Сливина Н. А. Лабораторный практикум по высшей математике: Учеб. пособие для втузов. - 2-е изд. - М.: Высш. шк., 1994. 8. Самарский А. А., Гулин А. В. Численные методы. - М.: Наука, 1989. 9. Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических вычислений/Пер. с англ. - М.: Мир, 1980. 10. Хемминг Р. Численные методы/Пер. с англ. - М.: Наука, 1972. 11. Методические указания к лабораторным работам по дисциплине “Вычислительная математика” / Сост.: В. Н. Кафтасьев, А. Р. Лисс, М. С. Титов; СПбГЭТУ.- СПб., 1997. 12. Воробьева Г. Н., Данилова А. Н. Практикум по численным методам. - М.: Высш. шк., 1979. 13. Волков Е. А. Численные методы: Учеб. пособие. - М.: Наука, 1982. 14. Егоренков Д. Л., Фрадков А. Л., Харламов В. Ю. Основы математического моделирования. Построение и анализ моделей с примерами на языке MATLAB: Учеб. пособие/ Под ред. А. Л. Фрадкова; БГТУ. - СПб., 1994. 15. Компьютерная математика: Методические указания к лабораторным работам / Сост. И.А. Назаров; СПбГЭТУ. - СПб., 1993.
СОДЕРЖАНИЕ
Введение…….…………………………………………………………………………….3 1. Интерполирование функций.……………………………………………………….…4 1.1. Интерполяционные формулы для неравноотстоящих узлов.………………….….5 Лабораторная работа № 9…..……………………………………………………..….8 1.2. Интерполяционные формулы для равноотстоящих узлов…………………..…...17 Лабораторная работа № 10…………………………………………………….……18 2. Решение систем линейных алгебраических уравнений……………………….…...25 2.1. Решение систем линейных алгебраических уравнений методом Гаусса……..…25 Лабораторная работа № 11.……………………………………………………..…..26 2.2. Решение систем линейных алгебраических уравнений методом простой итерации…………………………………………………………………………….……26 Лабораторная работа № 12………………………………………………………......27
2.3. Программы для решения систем линейных алгебраических уравнений….….…28 Список литературы………………………………………………..……………..………30
|
||||||||
Последнее изменение этой страницы: 2016-08-15; просмотров: 313; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.143.222.84 (0.009 с.) |