|
:
Сформувати вузлову модель електричної системи.
приклад:
Для заданої електричної системи (рис. 1-1), використовуючи схеми заміщення елементів ланцюга і пред ставлю джерела електро енерго гии як джерела напруги, а пот ребітелей заданими струмами навантаження, скласти розрахункову схему.
Для даного прикладу - це схема, представлена на рис.1-2. Балансуючого вузла привласнимо номер 0, решта нумеруються довільно, але при нумерації спочатку враховують гілки дерева 1-9, а потім хорди 10-16.
Перший контур з'являється при замиканні хорди 10, другий контур - утворюється хордою 11і гілками 9,3,7. Позитивні напрямки контурів приймаємо за годинниковою стрілкою. Позитивні напрямки хорд повинні відповідати напрямам контурів, позитивні напрямки гілок дерева вибираємо довільно.
Складаємо матриці інціденцій:
Матриця з'єднання гілок у вузлах
Матриця з'єднань гілок в контури:
Матриця коефіцієнтів розподілу струмів для гілок дерева:
Системи рівнянь 1 закону Кірхгофа:
Узагальнена система рівнянь електричного кола в матричному вигляді:
Контурна модель електричної системи формулюється так:
:
Тут - власні і взаємні опору контурів, які обчислюють за формулами:
Знаючи контурні струми можемо визначити струми гілок і напруги вузлів:
;
Вузлову модель будуємо використовуючи рівняння:
Власні провідності вузлів визначаються таким чином:
В вузловий моделі гілку 17 не враховується, так як напруга балансуючого вузла задається в явному вигляді, тому матриця М використовується тут без останнього стовпця, відповідного умовної гілки 17.:
//HOWTO solve system of linear equations//ax=b//where a[N][N] is square matrix,//b[N] and x[N] are columns //data are stored in input text file: //input file format://a_11 a_12 a_13... a_1N b_1//a_21 a_22 a_23... a_2N b_2//...//a_N1 a_N2 a_N3... a_NN b_N #include <stdio.h>#include <process.h>float **a, *b, *x;int N;char filename[256];FILE* InFile=NULL;void count_num_lines(){ //count number of lines in input file - number of equations int nelf=0; //non empty line flag do{ nelf = 0; while(fgetc(InFile)!='\n' &&!feof(InFile)) nelf=1; if(nelf) N++; }while(!feof(InFile));} void freematrix(){ //free memory for matrixes int i; for(i=0; i<N; i++){ delete [] a[i]; } delete [] a; delete [] b; delete [] x;} void allocmatrix(){ //allocate memory for matrixes int i,j; x = new float[N]; b = new float[N]; a = new float*[N]; if(x==NULL || b==NULL || a==NULL){ printf("\nNot enough memory to allocate for %d equations.\n", N); exit(-1); } for(i=0; i<N; i++){ a[i] = new float[N]; if(a[i]==NULL){ printf("\nNot enough memory to allocate for %d equations.\n", N); } } for(i=0; i<N; i++){ for(j=0; j<N; j++){ a[i][j]=0; } b[i]=0; x[i]=0; }} void readmatrix(){ int i=0,j=0; //read matrixes a and b from input file for(i=0; i<N; i++){ for(j=0; j<N; j++){ fscanf(InFile, "%f", &a[i][j]); } fscanf(InFile, "%f", &b[i]); }} void printmatrix(){ //print matrix "a" int i=0,j=0; printf("\n"); for(i=0; i<N; i++){ for(j=0; j<N; j++){ printf(" %+f*X%d", a[i][j], j); } printf(" =%f\n", b[i]); }} void testsolve(){ //test that ax=b int i=0,j=0; printf("\n"); for(i=0; i<N; i++){ float s = 0; for(j=0; j<N; j++){ s += a[i][j]*x[j]; } printf("%f\t%f\n", s, b[i]); }}void printresult(){ int i=0; printf("\n"); printf("Result\n"); for(i=0; i<N; i++){ printf("X%d = %f\n", i, x[i]); }}void diagonal(){ int i, j, k; float temp=0; for(i=0; i<N; i++){ if(a[i][i]==0){ for(j=0; j<N; j++){ if(j==i) continue; if(a[j][i]!=0 && a[i][j]!=0){ for(k=0; k<N; k++){ temp = a[j][k]; a[j][k] = a[i][k]; a[i][k] = temp; } temp = b[j]; b[j] = b[i]; b[i] = temp; break; } } } }}void cls(){ for(int i=0; i<25; i++) printf("\n");}void main(){ int i=0,j=0, k=0; cls(); do{ printf("\nInput filename: "); scanf("%s", filename); InFile = fopen(filename, "rt"); }while(InFile==NULL); count_num_lines(); allocmatrix(); rewind(InFile); //read data from file readmatrix(); //check if there are 0 on main diagonal and exchange rows in that case diagonal(); fclose(InFile); printmatrix(); //process rows for(k=0; k<N; k++){ for(i=k+1; i<N; i++){ if(a[k][k]==0){ printf("\nSolution is not exist.\n"); return; } float M = a[i][k] / a[k][k]; for(j=k; j<N; j++){ a[i][j] -= M * a[k][j]; } b[i] -= M*b[k]; } } printmatrix(); for(i=N-1; i>=0; i--){ float s = 0; for(j = i; j<N; j++){ s = s+a[i][j]*x[j]; } x[i] = (b[i] - s) / a[i][i]; } InFile = fopen(filename, "rt"); readmatrix(); fclose(InFile); printmatrix(); testsolve(); printresult(); freematrix();}
Створіть у будь-якому текстовому редакторі (наприклад в notepad-е) файл, де напишіть коефіцієнти рівнянь порядково через пробіл, приблизно так:
a11 | a12 | a13 | ... | a1N | b1 |
a21 | a22 | a23 | ... | a2N | b2 |
a31 | a32 | a33 | ... | a3N | b3 |
aN1 | aN2 | aN3 | ... | aNN | bN |
Наприклад:
-3 | |||
-1 | -1 | ||
-1 |
Цей файл необхідно створити в тій директорії, де лежить програма, Результат:
X0 = 3.000000
X1 = 1.000000
X2 = 2.000000
Це і є рішення системи рівнянь, тобто набір невідомих Х.
Призначення підпрограм в даній програмі:
• void count_num_lines () - підраховує кількість рівнянь в системі
• void allocmatrix () - виділяє пам'ять для масивів для зберігання коефіцієнтів рівнянь, вільних членів і рішення
• void readmatrix () - прочитує з файлу коефіцієнти і вільні члени в масиви
• void printmatrix () - роздруковує систему рівнянь
• void diagonal () - робить так, щоб на головній діагоналі не було нулів, щоб не довелося одного разу ділити на нуль в процесі приведення матриці до трикутного виду
• void testsolve () - підставляє рішення в систему і роздруковує поруч те, що виходить у лівій частині рівняння і для порівняння друкує поруч вільні члени, ті, що в правій частині рівняння; вийшли два стовпці повинні збігатися, якщо рівняння вирішені правильно
• void printresult () - роздруковує вийшов стовпець рішень
• void freematrix () - звільняє пам'ять, яка була виділена раніше
• void cls () - стирає екран на початку роботи програми
• void main () - основна функція з якої послідовно викликаються всі вищеперелічені функції, і проходить процес приведення системи рівнянь до трикутного вигляду і зворотна прогонка.
Дата добавления: 2015-08-27; просмотров: 71 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |
1. Тема: Расчет на прочность при колебаниях | | | http://ficbook.net/readfic/3097962 1 страница |