Линейные электрические цепи
Линейные электрические цепи
14 Курсовая работа "Линейные электрические цепи" Введение Для решения поставленной задач используется язык С++. На сегодняшний день он является одним из самых распространенных языков программирования. Его преимуществами являются гибкость, переносимость, универсальность. На этом языке написаны самые распространенные на сегодняшний день операционные системы, такие как Windows и Linux. 1. Постановка задачи В схеме электрической цепи, приведенной на рисунке 1, определить токи, в ветвях пользуясь законами Кирхгофа. Параметры элементов цепи: R1=50 Ом, R2=20 Ом, R3=50 Ом, R4=80 Ом, E1=50 В, E2=400 В. В программе не обходимо предусмотреть, откуда будут считываться исходные данные - с диалогового окна или из текстового файла. Результаты вычислений сохранить в текстовом файле result.txt. Средствами математического пакета или электронных таблиц проверить результаты работы программы, для решения системы уравнений использовать метод Крамера или метод обратной матрицы, также можно использовать функции математического пакета. Написать программу решения задачи, для решения системы линейных алгебраических уравнений воспользоваться методом Гаусса. I1 I2 R1 1 R2 I3 E1 E2 R3 2 R4 2. Математическая модель поставленной задачи Выбираем произвольно положительные направления искомых токов ветвей и обозначаем их на схеме. Составляем уравнения по первому закону Кирхгофа для узла 1. Выбрав направление обходов контуров, составляем уравнения по второму закону Кирхгофа. Получаем систему из трех уравнений: I1 + I2 - I3 = 0 I1R1 + I3R3 = E1 - I2 (R2 + R4) - I3R3 = - E2 Преобразуем систему уравнений в матрицу коэффициентов системы - А, столбец ее свободных членов в вектор - b, столбец из неизвестных (искомый вектор) в вектор - х. Тогда система кратко может быть записана в виде матричного уравнения Ах=b. Решим эту систему линейных уравнений с помощью алгоритма последовательного исключения неизвестных - метод Гаусса. Используя этот метод мы преобразовываем не систему уравнений, а расширенную матрицу системы, которую получаем при добавлении к основной матрице А столбца свободных членов b. Прямым ходом метода Гаусса мы приведем расширенную матрицу к треугольному виду, т.е. все элементы матрицы ниже главной диагонали будут равны нулю. Если на главной диагонали встречается элемент равный нулю, заменяем его максимальным по модулю элементом в этом столбце, меняя строки. В результате выполнения прямого хода метода Гаусса система уравнений будет иметь вид: а00х0+а01х1 +а02х2+ … +а0n-1хn-1=b0; a11х1+а12х2+ … +а1n-1xn-1=b1; a22x2+ … +a2n-1xn-1=b2; … an-1xn-1=bn-1. И эту систему решим обратным ходом метода Гаусса. 3. Блок-схема алгоритма 14 Рис. 3.1. Блок-сема программы 4. Описание алгоритма На рис. 3.1 представлена блок-схема программы: блок 1 - считываем из файла данные - R1, R2, R3, R4, E1, E2; блок 2 - формируем матрицу А и вектор свободных членов В; блок 3 - вызов функции SLAU (метод Гаусса); блок 3 - вывод решений - массива х, т.е. значение искомых токов - I. На рис. 3.2 представлена блок-схема метода Гаусса: блоки 1-6 - ввод данных, n - размерность системы уравнений, система задается в виде матрицы А и вектора свободных коэффициентов b; блоки 6-17 - прямой ход метода Гаусса; блоки 22-26 - обратный ход метода Гаусса; блоки 18-19 - если результат проверки этих условий положительный, то выводится сообщение, что система имеет бесконечное множество решений (блок 21); если условие 19 выполняется, а 20 - нет, то выводится сообщение - нет решений (блок 21); блоки 22-25 - решения системы уравнений, представлены вектором х; блок 26 - вывод на печать, в случае невыполнения условия. 5. Характеристика данных и их условные обозначения |
№ п\п | Наименование данных | Обозначение в блок-схеме | Обозначение в программе | Тип переменных | | 1 | Сопротивление цепи R | R | Ri | double *R | | 2 | Матрица А | Aij | Aij | double **A | | 3 | Вектор свободных членов b | Bi | Bi | double *B | | 4 | Э.Д.С. Е | Е | Ei | double *E | | 5 | Сила тока I | x | x | double *x | | |
6. Текст программы #include «stdafx.h» #include <iostream.h> #include <fstream.h> #include <math.h> #include <iomanip.h> #include <stdlib.h> #include <malloc.h> int SLAU (double **matrica_a, int n, double *massiv_b, double *x) // Функция SLAU возвращает значение типа int: 0, если решение найдено, // -1 если система имеет бесконечное множество решений, -2 если // система не имеет решений. Параметры ф-ии: n-размерность матрицы, //matrica_a - матрица коэффициентов СЛАУ, massiv_b - вектор правых // частей, х - решение СЛАУ. { int i, j, k, r; double c, M, max, s, **a, *b; // Выделение памяти для а и b. a=new double *[n]; for (i=0; i<n; i++) a[i]=new double[n]; b=new double [n]; // В а записываем копию матрицы, в b копию вектора правых частей. for (i=0; i<n; i++) for (j=0; j<n; j++) a[i] [j]=matrica_a[i] [j]; for (i=0; i<n; i++) b[i]=massiv_b[i]; // Прямой ход метода Гаусса: приводим матрицу к диагональному виду. for (k=0; k<n; k++) { // Поиск максимального по модулю элементов в k-м столбце. max=fabs (a[k] [k]); r=k; for (i=k+1; i<n; i++) if (fabs (a[i] [k])>max) { max=fabs (a[i] [k]); r=i; } // Меняем строки местами k-ю и r-ю. for (j=0; j<n; j++) { c=a[k] [j]; a[k] [j]=a[r] [j]; a[r] [j]=c; } c=b[k]; b[k]=b[r]; b[r]=c; // Приведение матрицы к диагональному виду. for (i=k+1; i<n; i++) { for (M=a[i] [k]/a[k] [k], j=k; j<n; j++) a[i] [j] - =M*a[k] [j]; b[i] - =M*b[k]; } } // Обратный ход метода Гаусса. if (a [n-1] [n-1]==0) if (b[n-1]==0) return -1; else return -2; else { for (i=n-1; i>=0; i-) { for (s=0, j=i+1; j<n; j++) s+=a[i] [j]*x[j]; x[i]=(b[i] - s)/a[i] [i]; } return 0; } // Освобождение памяти, выделенной под копии матрицы // коэффициентов, вектора правых частей. for (i=0; i<n; i++) delete [] a[i]; delete [] a; delete [] b; } int main() { int result, i, N, K, L; double **A, *B, *x, *R, *E; ifstream f; // Открытие текстового файла abc.txt в режиме чтения f.open («A:\\Kurs\\abc.txt», ios:in); N=3; K=4; L=2; // Выделение памяти для матрицы правых частей и вектора свободных // членов. A=new double *[N]; for (i=0; i<N; i++) A[i]=new double[N]; B=new double [N]; x=new double [N]; R=new double [K]; E=new double [L]; for (i=1; i<=K; i++) // Чтение значении R. f>>R[i]; // Формирование матрицы правых частей. A[0] [0]=1; A[0] [1]=1; A[0] [2]=-1; A[1] [0]=R[1]; A[1] [1]=0; A[1] [2]=R[3]; A[2] [0]=0; A[2] [1]=-R[2] - R[4]; A[2] [2]=-R[3]; for (i=1; i<=L; i++) // Чтение значений Е. f>>E[i]; // Формирование вектора свободных членов. B[0]=0; B[1]=E[1]; B[2]=-E[2]; // Вызов функции решения СЛАУ методом Гаусса. Если result=0, то // система имеет единственное решение, result= -1, то система имеет // бесконечное множество решений, result= -2, то система не имеет // решений. result=SLAU (A, N, B, x); if (result==0) { ofstream ff; // Открытие текстового файла rezult.txt в режиме записи. ff.open («A:\\Kurs\\rezult.txt», ios:out); ff<< «Massiv X\n»; // Вывод массива решения. cout<< «Massiv X\n»; // Запись результатов решения в текстового файла rezult.txt. for (i=0; i<N; i++) { cout<<x[i]<<»\t»; ff<<x[i]<<»\t»; } // Закрытие файла. ff.close(); } else if (result==-1) cout<< «Great number of Solution»; else if (result==-2) cout<< «No solution»; // Освобождение памяти, выделенной под матрицы коэффициентов, // вектора правых частей. for (i=0; i<N; i++) delete [] A[i]; delete [] A; delete [] B; delete [] x; return 0; } 7. Контрольный пример Проведем контрольный расчет с помощью электронных таблиц Excel. |
А | 1 | 1 | -1 | | B | 0 | | | 50 | 0 | 50 | | | 50 | | | 0 | -100 | -50 | | | -400 | | | | | | | | | | Aобр | 0,4 | 0,012 | 0,004 | | Х | -1 | | | 0,2 | -0,004 | -0,008 | | | 3 | | | -0,4 | 0,008 | -0,004 | | | 2 | | |
8. Анализ результатов Поставленная задача определения величин и направлений токов в ветвях электрической цепи решена с использованием метода Гаусса. В результате работы разработанной программы мы получили значения искомого вектора Х: -1, 3, 2. За вектор Х мы приняли значения токов в ветвях, т.е. I1= - 1, I2= 3, I3= 2. Ток I1 имеет отрицательное значение т. к. направлен противоположно токам I2, I3. Работу программы мы проверили в электронных таблицах Excel, используя метод обратной матрицы. Так как результаты решения задачи с помощью Excel и С++ совпадают, делаем вывод о том, что созданная нами программа работает с достаточно малыми погрешностями исчислений. Неточности практически полностью отсутствуют благодаря применению точных методов решения. Заключение В данной курсовой работе для решения электротехнической задачи были применены и закреплены теоретические знания и практические навыки, полученные при изучении курса «Введение в информатику». Основным методом решении задачи был метод Гаусса. Проверка работы программы была произведена в электронных таблицах Excel. Результаты полученные при программировании задачи на языке С++ совпадают с результатами полученными при решении задачи в электронных таблицах, значит задача выполнена полностью. Список используемой литературы 1. Алексеев Е.Р. MS Visual C++ и Turbo C++ Explorer (под общей редакцией Чесноковой О.В.) / Алексеев Е.Р. - М.: НТ Пресс, 2007. - 352 с.: ил. - (Полная версия). 2. Бронштейн И.Н., Семендяев К.А. Справочник по математике для инженеров и учащихся втузов. - 13-е изд., исправленное. - М.: Наука, Гл. ред. физ.-мат. лит., 1986. - 544 с. 3. Пасечник Н.Д. Элементарная электротехника. Киев - 1963. - 234 с.
|