Смекни!
smekni.com

Линейные электрические цепи 2 (стр. 1 из 2)

Курсовая работа

"Линейные электрические цепи"


Введение

Для решения поставленной задач используется язык С++. На сегодняшний день он является одним из самых распространенных языков программирования. Его преимуществами являются гибкость, переносимость, универсальность. На этом языке написаны самые распространенные на сегодняшний день операционные системы, такие как 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х001х102х2+ … +а0n-1хn-1=b0;

a11х112х2+ … +а1n-1xn-1=b1;

a22x2+ … +a2n-1xn-1=b2;

an-1xn-1=bn-1.

И эту систему решим обратным ходом метода Гаусса.


3. Блок-схема алгоритма

Рис. 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:&bsol;Kurs&bsol;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:&bsol;Kurs&bsol;rezult.txt», ios:out);

ff<< «Massiv X&bsol;n»;

// Вывод массива решения.

cout<< «Massiv X&bsol;n»;

// Запись результатов решения в текстового файла rezult.txt.

for (i=0; i<N; i++)

{

cout<<x[i]<<»&bsol;t»;

ff<<x[i]<<»&bsol;t»;

}

// Закрытие файла.

ff.close();

}

else if (result==-1)

cout<< «Great number of Solution»;

else if (result==-2)