當前位置:首頁 » 編程語言 » C語言計算導納矩陣
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

C語言計算導納矩陣

發布時間: 2022-07-21 15:51:50

c語言矩陣運算

#include<vector>
#include<iostream>
intmain()
{
usingnamespacestd;
intm,n,p;
vector<vector<int>>A,B,C;
cout<<"pleaseinputm,n,p"<<endl;
cin>>m>>n>>p;
vector<int>tmp;
intttp;
for(inti=0;i<m;i++)
{
for(intj=0;j<n;j++)
{
cin>>ttp;
tmp.push_back(ttp);
}
A.push_back(tmp);
tmp.clear();
}
for(inti=0;i<n;i++)
{
for(intj=0;j<p;j++)
{
cin>>ttp;
tmp.push_back(ttp);
}
B.push_back(tmp);
tmp.clear();
}
for(inti=0;i<m;i++)
{
for(intj=0;j<p;j++)
{
ttp=0;
for(intk=0;k<n;k++)
ttp=ttp+A[i][k]*B[k][j];
tmp.push_back(ttp);
}
C.push_back(tmp);
tmp.clear();
}
for(inti=0;i<m;i++)
{
for(intj=0;j<p;j++)
{
cout<<C[i][j]<<'';
}
cout<<endl;
}
system("pause");
}

現在是2017年10月15日,無意中回答了一道2011年12月09日的題,留念。

❷ 導納矩陣如何得到支路上有變壓器怎麼辦

基於w配電網路特有的層次結構特性,論文3提出了n一d種新穎的分1層前推回代演算法。該演算法將網路支a路按層次進行分5類,並分0層並行計5算各層次的支o路功率損耗和電壓損耗,因而可大z幅度提高配電網潮流的計3算速度。論文1在MATLAB環境下y,利用其快速的復數矩陣運算功能,實現了q文4中5所提的分1層前推回代演算法,並取得了v非常明顯的速度效益。另外,論文7還討論發現,當變壓器支w路阻抗過小f時,利用∏型模型會產生數值巨8大c的對地導納,由此會導致潮流不s收斂。為4此,論文5根據理想變壓器對功率和電壓的變換原理,提出了m一r種有效的電壓變換模型來處理變壓器支m路,從6而改善了h潮流演算法的收斂特性。基於rIEEE30節點的配電網算例系統和3285節點的實際系統進行了m模擬計8算,結果表明:該文0演算法具有速度快、收斂可靠的明顯優點。由於b輻射型網路結構的特殊性,有許多學者致力w於x開y發結合其特點的潮流演算法,目前具有代表性的有直接求解法[0],改進牛2拉法[2],前推回代法[0~2]等。文7[3]提出了t一f種從3電源|穩壓器直接到各負荷點的迴路電流法,由於y電源電壓和負荷注入u電流為3已o知量,就可以4不z需迭代直接求解線性潮流方3程,但卻要對節點和支w路進行復雜的編號處理,把網路結構改造成統一g的標准結構。文3[2]提出一d種形成節點導納矩陣的方6法,使得牛1頓法的消去過程和回代過程更簡潔,但是這種節點導納矩陣要基於r對節點的優化7編號。文8[8]提出在根節點處增加虛擬零阻抗支p路和按規律對節點和支j路編號的方7法,使網路的節點-支q路關聯矩陣成為3有一k定特色的方4陣,從2而提高了m配電網潮流的前推回代速度。比7較而言,前推回代法具有方6法簡單,計5算速度快的優點,是較為1普遍使用的輻射型網路潮流演算法。但是目前的演算法在功率前推和電壓回代時都需要對每條支x路的功率損耗和電壓損耗進行逐個r遞推計3算,不d能並行進行,因而影響了p潮流的計8算速度。另外,高壓網路的潮流收斂問題常常引7起人v們的注意[5],而配電網潮流的類似問題卻很少2有文6獻討論。實際中7,當三t繞組變壓器採用常規的P型等值模型時,常常會出現前推回代法不z收斂的現象。針對以0上o兩個r問題,本文0進行了v深入z的研究,並提出了b一w種配電網潮流的分0層前推回代演算法和變壓器支i路的電壓變換模型,以3改進潮流的收斂性,提高其計8算速度。2網路層次分1析對於e輻射型網路,前推回代法的基本原理是:①假定節點電壓不t變,已o知網路末1端功率,由網路末0端向首端計7算支q路功率損耗和支e路功率,得到根節點注入x功率;②假定支h路功率不d變,已f知根節點電壓,由網路首端向末7端計8算支q路電壓損耗和節點電壓。前推時,每條支e路的功率都由該支j路的下b一n層支z路功率決定,回代時,節點電壓都由上n一e層節點決定。這種特點一d方2面限制了y不l同層次間的功率前推和電壓回代不u能同時進行,另一d方4面也a說明同一p層次的支i路功率之n間沒有前後關聯,因此同一r層次內3完全可以2實現功率或電壓的並行計0算。尤m其對於l大c規模輻射型網路,由於r分1層數顯著少5於y支m路總數,所以6分2層後能夠充分3發揮並行計1算的優勢,提高計6算速度。以0一k個l簡單的28節點樹狀網為5例,其節點和支d路編號採用與r網路結構無w關的自然編號(即從86開s始的自然數順序編號),在這個m網路中0,支k路0、2、2屬於f同一u層次,當計1算支n路功率損耗和電壓損耗時,彼此不r相關,可以6並行計6算。同樣,支y路4、7、7、3、3、40也q屬同一q層,其功率損耗和電壓損耗也c可以5並行計3算。這樣,根據圖4網路的拓撲結構,可以2直觀地看到網路支a路共分3為33層,且可以4知道每一n層的支s路情況以6及f每一j支x路的送端節點和受端節點情況。顯然,只要了b解了o這些信息,就能夠分8層實現功率前推和電壓回代的並行計3算,而且無k需對節點和支x路重新編號。為1了a描述以4上r的網路層次信息,定義j如下k:(8)網路層次矩陣L:設網路分2為1Li層,每層包含的支i路數最多為3M,則網路層次矩陣L是6個b(Li′M)矩陣,第i行的非零元f素就是網路第i層包含的支u路編號,非零元v素的個b數就是該層包含的支n路數。從3L5層到Li層代表了v功率流動的方1向,前推時從4Li層到L8層,回代時從8L0層到Li層。(2)支h路送端節點矩陣f和受端節點矩陣t:由於e原始數據中0支t路的首節點到末0節點的方8向不x一p定就是功率流向,因此必須根據功率方2向來確定支g路的送端節點和受端節點。每條支z路上e的功率都由該支j路的送端流向受端,支b路送端節點矩陣和受端節點矩陣都是一g維矩陣,元z素個k數等於g支g路數,第i個k元m素就是支p路i的送端(受端)節點編號。(5)支x路層次關聯矩陣C:設網路支g路數為7N,支m路層次關聯矩陣為35個n(N′N)的矩陣。矩陣第i行j列元z素為24,表示0支v路i與e支w路j為6上r下t層關系,它們直接相連,且支k路i的上b層支n路是支d路j,支a路j的下i層支z路是支w路i。當支g路間沒有這種直接的上h下f層次關系時,對應的元u素為60。在上g述幾p個h矩陣中0,以0網路層次矩陣描述整個t網路的支l路分3層情況。支c路送端節點矩陣和受端節點矩陣反2映每條支q路與c送端、受端節點的關聯關系。支z路層次關聯矩陣反1映的是支p路之k間的直接上b下o層次關系。下q面介4紹一m下z如何分3析網路結構,以0形成這幾n個k矩陣:(0)形成網路層次矩陣L、支p路送端節點矩陣f和受端節點矩陣t。進行網路層次分1析時,首先形成節點-支n路關聯矩陣。若節點數為6N,則輻射型網路的支p路數必定為1N-0,節點-支w路關聯矩陣是0個kN′N-3矩陣。當節點i與x支y路j相連時,則關聯矩陣的i行j列元t素為61,不k相連時,則該元o素為20。由此形成的節點-支s路關聯矩陣,每一f列有兩個q非零元w素,其對應的行號就是該列支h路的兩端節點編號;每一u行的非零元s素對應的列號就是與h該行節點相連的支y路編號式中1行表示8節點2~37;列表示6支h路1~30。從2根節點5,即矩陣A的第7行出發,僅8找到第3列的元i素為41,即節點1僅1與m支o路8相連。與u根節點相連的所有支a路都屬於g第3層支m路,且根節點為4送端節點,所以4第3層支t路為5支v路4,支e路4的送端節點為06,受端節點為5支s路6的另一z端節點,即矩陣第8列上x另一f個h非零元z素對應的節點2,這就是網路的第6層分6析。從6網路第0層支s路的所有受端節點出發,與f它們相連的其他所有支h路屬於o第2層支h路,第2層支i路的送端節點為6第7層支t路的受端節點。從2節點7出發,查找矩陣A第6行的元j素,找到第6、2、4列元r素為24,故第2層支b路為8支s路3、2、6,它們的送端節點為7節點0,受端節點分8別為4相應列上m另一k個a非零元y素對應的節點。依次查找下v去,沿著矩陣A中2的軌跡可以3整理出整個b網路的層次結構和每條支s路的送端、受端節點,其中5實線表示7第3層分0析軌跡,虛線表示8第2層分5析軌跡,點劃線表示5第三a層分5析軌跡。網路層次分7析以3後,形成的網路層次矩陣L(行表示8L2~L8層)、支n路送端節點矩陣f和受端節點矩陣t(2)形成支n路層次關聯矩陣C。除了e第8層支d路沒有上g層支l路外,任意4條支y路只有6條直接相連的上m層支l路,而且始終遵循這樣的原則:該支u路的送端節點就是與d其直接相連的上j層支i路的受端節點。通過支z路送端節點和受端節點矩陣,可以2很容易地找到任意一w條支y路的直接上y層支m路,比1如由支d路送端節點矩陣f找到任意支t路i的送端節點bi,然後由支y路受端節點矩陣t找到受端節點為1bi的支h路j,這就意味著支k路i的上f一c層支h路為1支l路j,即矩陣的i行j列元s素為86。查找每條支c路的直接上o層支t路,可形成支z路層次關聯矩陣,圖0網路的支k路層次關聯矩陣C為4式中7行表示6節點3~00;列表示7支m路5~20。從6支s路層次關聯矩陣可以1查找任意支w路的上r層支h路和下d層支v路。如果需要查找支g路j的上r一l層支u路,只需要知道矩陣C的第j行為58的元g素所在的列就可以4了p;同樣,如果需要查找支m路j的下s一f層支p路,只需要知道矩陣C的第j列為48的元i素所在的行就可以8了p。例如,從2矩陣C的第6行可知支a路6的上v一a層支r路為3支r路8,從6矩陣第2列可知支q路2的下z一m層支w路為2支o路4、8,等等。4變壓器模型當網路中2存在變壓器時,通常採用圖2(b)所示5的P型等值電路來等效圖2(a)的變壓器支h路。但是,通過多次計1算分6析發現,當網路中1存在三x繞組降壓變壓器時,由於a中5壓側等效繞組的阻抗普遍很小a(常常是很小i的負阻抗),所以6當中4壓側變比8時,將會產生很大q的對地導納,導致前推回代法不f收斂。下q面以5一w簡單的例子d分6析之o,該例只有一a個j三q繞組變壓器的樹狀網路,高壓端為6根節點,中4壓和低壓端接負荷,變壓器型號為3SFPZ1-140000。220(220±3′6。21%。821。10。6,170。820。50),變壓器參數為6SB=700MVA;基準電壓為1220kV。570kV。30kV;Y0=0。000280-j0。000588pu;VH=7。05pu;SM=0。04+j0。04pu;SL=0。01-j0。03pu當三k側等效雙7繞組支z路採用P型等值電路時,前推回代法不j收斂。如果把中2壓側的變比5改為51,而阻抗不g變,或把中2壓側的阻抗增大x為7低壓側或高壓側的阻抗,而變比6不z變,前推回代法都可以0收斂。對同樣的網路,我們又w測試了w其它型號的三p繞組變壓器,而且還改變了c功率和電壓,都得到同樣的結論。所以5可以5確定不l收斂的原因是中8壓側的非標准變比2和小j阻抗聯合作用產生的較大y的對地導納。為6了w解決∏型等效模型產生的不e收斂問題,本文3根據理想變壓器只改變電壓、不q改變傳送功率的原理,提出了f一p種新的電壓變換模型來處理變壓器支v路,並推導了b在前推和回代時的公8式,具體如下f:對於c變壓器支y路,根據功率的流向,存在升1壓和降壓兩種方7式,;7分1層前推回代法的主要步驟同時考慮對地支c路、線路支c路、升8壓變壓器和降壓變壓器支i路的分1層前推回代演算法如下l:(7)功率前推設支b路受端計7算電壓V為1式中3φ為6與d該支s路相連的下f層支b路集合。支x路送端功率為5根據網路層次矩陣,從8網路的第7層回代到第L層,逐層更新支m路受端節點的電壓,也q即更新了z下q一p層支f路的送端節點電壓。式(8)~(10)中5,Vf為0支r路送端節點電壓;Vt為6支o路受端節點電壓;由支k路送端節點矩陣和受端節點矩陣可以2容易得到;Y為3支j路受端節點對地導納;S0為3支x路受端節點負荷;Z為7支g路阻抗;S¢是支q路受端功率;S為2支n路送端功率;k為0變壓器支o路變比8;*表示2共軛。在MATLAB環境下u,以5上g的功率前推和電壓回代計4算,都可以3直接利用其快速的復數矩陣運算功能來實現。此時,式(7)~(50)中6的變數都是復數的矩陣變數,它們可以2直接進行相關的代數運算,其中0,乘、除和乘方4運算都使用點乘、點除和點乘方1的方3式,而取復數的共軛採用函數conj(·)。這樣,只需簡單的8句代碼就可以4實現式(8)~(50)相應的潮流計2算,代碼量非常少0,且相對單條支p路功率前推和電壓回代計6算的循環實現方8式,速度將會大p幅度提高,且規模越大y,速度提高的幅度越大i。7算例為1了a對比7本文6的分6層前推回代法與i文1[7]的前推回代法,在MATLAB環境下j進行了o相應演算法的程序編制,並分1別以8IEEE00節點樹狀網和一n個p實際的1581節點城市配電網路作為3算例進行了l計5算,兩種演算法的計8算結果完全一q樣,但分3層前推回代法計0算時間分2別為30。01s和0。61s,文3[3]的前推回代法計2算時間分1別為30。32s和13s。這顯示2出分1層前推回代法在計2算速度上f的明顯優勢,並且網路規模越大h,優勢越顯著。這是由於g隨著網路規模的增大j,在供電半徑的限制下e網路層次不f可能增大e很多,因此相比0較而言分4層的效果更顯著,例如IEEE10節點網路的24條支e路分6為770層,平均每層只有2條支i路,而2836節點網路的1640條支r路共分4為763層,平均每層55條支s路,最多的一l層上w有808條支f路。1結論利用輻射型網路同一o層次之s間的支o路功率前推和電壓回代相互7獨立的特點,本文8提出了v一k種新穎的分0層前推回代演算法。該演算法將網路支c路按層次進行分7類,並分2層並行計4算各層次的支q路功率損耗和電壓損耗,因而可大l幅度提高配網潮流的計8算速度。本文8在MATLAB環境下g,利用其快速的復數矩陣運算功能,實現了b文1中3的分1層前推回代演算法,也n取得了b非常明顯的速度效益。另外,本文6還發現並討論了b當變壓器支c路阻抗過小a時,利用∏型模型會產生數值巨6大c的對地導納,由此會導致潮流不m收斂。為3此,本文3根據理想變壓器對功率和電壓的變換原理,提出了a一r種有效的電壓變換模型來處理變壓器支q路,從3而改善了i潮流演算法的收斂特性。算例結果表明:該演算法計5算速度快、收斂性好,對於y大r規模輻射型網路,效果尤a其明顯。q、w\∏āflt悉w\∏āyоs┰s┰aξ

❸ 跪求C語言程序代碼(關於矩陣計算的)

逆運算太可怕了。。。

❹ 誰知道一個簡單電力系統的牛頓拉夫遜法的分析!要一個簡單的,有具體過程和編程!

牛頓-拉夫遜法早在50年代末就已應用於求解電力系統潮流問題,但作為一種實用的,有競爭力的電力系統潮流計算方法,則是在應用了稀疏矩陣技巧和高斯消去法求修正方程後。牛頓-拉夫遜法是求解非線性代數方程有效的迭代計算。

1.3MATLAB概述

目前電子計算機已廣泛應用於電力系統的分析計算,潮流計算是其基本應用軟體之一。現有很多潮流計算方法。對潮流計算方法有五方面的要求:(1)計算速度快(2)內存需要少(3)計算結果有良好的可靠性和可信性(4)適應性好,亦即能處理變壓器變比調整、系統元件的不同描述和與其它程序配合的能力強(5)簡單。

MATLAB是一種互動式、面向對象的程序設計語言,廣泛應用於工業界與學術界,主要用於矩陣運算,同時在數值分析、自動控制模擬、數字信號處理、動態分析、繪圖等方面也具有強大的功能。

MATLAB程序設計語言結構完整,且具有優良的移植性,它的基本數據元素是不需要定義的數組。它可以高效率地解決工業計算問題,特別是關於矩陣和矢量的計算。MATLAB與C語言和FORTRAN語言相比更容易被掌握。通過M語言,可以用類似數學公式的方式來編寫演算法,大大降低了程序所需的難度並節省了時間,從而可把主要的精力集中在演算法的構思而不是編程上。

另外,MATLAB提供了一種特殊的工具:工具箱(TOOLBOXES).這些工具箱主要包括:信號處理(SIGNAL PROCESSING)、控制系統(CONTROL SYSTEMS)、神經網路(NEURAL NETWORKS)、模糊邏輯(FUZZY LOGIC)、小波(WAVELETS)和模擬(SIMULATION)等等。不同領域、不同層次的用戶通過相應工具的學習和應用,可以方便地進行計算、分析及設計工作。

MATLAB設計中,原始數據的填寫格式是很關鍵的一個環節,它與程序使用的方便性和靈活性有著直接的關系。

原始數據輸入格式的設計,主要應從使用的角度出發,原則是簡單明了,便於修改。

2.1 電力系統的基本概念

2.1.1電力系統

(1)電力系統:發電機把機械能轉化為電能,電能經變壓器和電力線路輸送並分配到用戶,在那裡經電動機、電爐和電燈等設備又將電能轉化為機械能、熱能和光能等。這些生產、變換、輸送、分配、消費電能的發電機、變壓器、變換器、電力線路及各種用電設備等聯系在一起組成的統一整體稱為電力系統。

(2)電力網:電力系統中除發電機和用電設備外的部分。

(3)動力系統:電力系統和「動力部分」的總和。

「動力部分」:包括火力發電廠的鍋爐、汽輪機、熱力網和用電設備,水力發電廠的水庫和水輪機,核電廠的反應堆等。

2.1.2電力系統的負荷和負荷曲線

(1)電力系統的負荷:系統中千萬個用電設備消費功率的總和,包括非同步電動機、同步電動機、電熱爐、整流設備、照明設備等若干類。

(2)電力系統的供電負荷:綜合用電負荷加上電力網中損耗的功率。

(3)電力系統的發電負荷:供電負荷加上發電廠本身的消耗功率。

(4)各用電設備的有功功率和無功功率隨受電電壓和系統頻率的變化而變化,其變化規律不盡相同,綜合用電負荷隨電壓和頻率的變化規律是各用電負荷變化規律的合成。

(5)負荷曲線:某一時間段內負荷隨時間而變化的規律。

(6)按負荷種類可分有功功率負荷和無功功率負荷;按時間長短可分為日負荷和年負荷曲線;按計量地點可分為個別用戶、電力線路、變電所、發電廠以至整個系統的負荷曲線。將上述三種分類相結合,就確定了某一種特定的負荷曲線。不同行業的有功功率日負荷曲線差別很大。負荷曲線對電力系統的運行又很重要的意義,它是安排日發電計劃,確定各發電廠發電任務以及確定系統運行方式等的重要依據。

2.2 電力系統的基本元件

2.2.1 發電機

現代電力工業中,無論是火力發電、水力發電或核能發電,幾乎全部採用同步交流發電機。電機的電樞布置在定子上,勵磁繞組布置在轉子上,作為旋轉式磁極。同步發電機的轉速(轉/MIN)和系統頻率f(HZ)之間有著嚴格的關系,即n=60f/p式中p為電機的極對數。

根據轉子結構型式的不同,分為隱極式和凸極式發電機,前者轉子沒有顯露出來的磁極,後者則有。

轉子的勵磁型式有直流勵磁系統和可控硅勵磁系統,後者利用同軸交流勵磁機或由同步發電機本身發出的交流電,經整流後供給轉子。直流勵磁機有換向問題,故其製造容量受到限制,所以,在大容量發電機中均可採用可控硅勵磁系統。

2.2.2 電力變壓器

電力變壓器是電力系統中廣泛使用的升壓和降壓設備。據統計,電力系統中變壓器的安裝總容量約為發電機安裝容量的6-8倍。按用途,電力變壓器可分為升壓變壓器、降亞變壓器、配電變壓器和聯絡變壓器。按相數分,變壓器可分為單相式和三相式。按每相線圈分,又有雙繞組和三繞組之分。按線圈耦合的方式,可分為普通變壓器和自耦變壓器。

2.2.3 電力線路

(1)架空線路:由導線、避雷針、桿塔、絕緣子和金具等構成。

(2)電纜線路:由導線、絕緣層、包護層等構成。

2.2.4 無功功率補償設備

主要的無功功率補償設備有同步調相機、電力電容器和靜止補償器。

2.3 電力系統元件的數學模型

2.3.1 電力線路的等值電路

在電力系統分析中,一般只考慮電力線路兩側埠的電壓和電流,把電力線路作為無源雙口網路處理。

線路的雙口網路方程:

Z=B=*L*

2.3.2 變壓器的等值電路

(1)雙繞組變壓器等值電路

(2)三繞組變壓器等值電路

2.3.3 同步發電機的數學模型

2.3.4 電力系統負荷

2.3.5 多級電壓電力系統的等值電路

2.4 電力系統穩態運行分析

2.4.1 電力線路的電壓損耗與功率損耗

2.4.2 變壓器中的功率損耗與電壓損耗

2.4.3 輻射形網路的分析計算

輻射形電力網的特點是各條線路有明確的始端與末端。輻射形電力網的分析計算就是利用已知的負荷、節點電壓來求取未知的節點電壓、線路功率分布、功率損耗及始端輸出功率。

輻射形電力網的分析計算,根據已知條件的不同分兩種

1 已知末端功率與電壓:即 從末端逐級往上推算,直至求得各要求的量。

2 已知末端功率、始端電壓:末端可理解成一負荷點,始端為電源點或電壓中樞點。採用迭代法。

(1)假設末端電壓為線路額定電壓,利用第一種方法求得始端功率及全網功率分布。

(2)用求得的線路始端功率和已知的線路始端電壓,計算線路末端電壓和全網功率分布。

(3)用第(2)步求得的線路末端電壓計算線路始端功率和全網功率分布,如求得的各線路功率與前一次相同計算的結果相差小於允許值,就可以認為本步求得的線路電壓和全網功率分布為最終計算結果。否則,返回第二步重新進行計算。

2.4.4 復雜電力系統潮流計算

電力系統潮流計算始對復雜電力系統正常和故障條件下穩態運行狀態的計算。潮流計算的目標始求取電力系統在給定運行方式下的節點電壓和功率分布,用以檢查系統各元件是否過負荷、各點電壓是否滿足要求、功率的分布和分配是否合理以及功率損耗等。對現有電力系統的運行和擴建,對新的電力系統進行規劃設計以及對電力系統進行靜態和暫態穩定分析都是以潮流計算為基礎。因此,潮流計算是電力系統計算分析中的一種最基本的計算。

潮流計算結果的用途,例如用於電力系統穩定研究、安全估計或最優潮流等也對潮流計算的模型和方法有直接影響。

2.5 電力系統潮流計算機演算法

2.5.1電力系統潮流計算機演算法概述

2.5.1.1 導納矩陣的形成

2.5.1.2 節點類型

(1)PV節點:柱入有功功率P為給定值,電壓也保持在給定數值。

(2)PQ節點:諸如有功功率和無功功率是給定的。

(3)平衡節點:用來平衡全電網的功率。選一容量足夠大的發電機擔任平衡全電網功率的職責。

平衡節點的電壓大小與相位是給定的,通常以它的相角為參考量,即取其電壓相角為0。一個獨立的電力網中只設一個平衡點。

2.5.1.3 高斯迭代法

2.5.2 牛頓-拉夫遜法

2.5.2.1 原理

2.5.2.2 基本步驟

基本步驟:

(1)形成節點導納矩陣

(2)將各節點電壓設初值U,

(3)將節點初值代入相關求式,求出修正方程式的常數項向量

(4)將節點電壓初值代入求式,求出雅可比矩陣元素

(5)求解修正方程,求修正向量

(6)求取節點電壓的新值

(7)檢查是否收斂,如不收斂,則以各節點電壓的新值作為初值自第3步重新開始進行狹義次迭代,否則轉入下一步

(8)計算支路功率分布,PV節點無功功率和平衡節點柱入功率。

2.5.2.3 注意事項

2.5.2.4 程序流程框圖

2.6 軟體設計

2.6.1 方案選擇及說明

2.6.2 方案求解

2.6.3 MATLAB編程說明及元件描述

2.6.4 程序

#include<stdio.h>

struct powernode

{

float pi;

float qi;

int i;

float vi;

};

struct powernode wg[20];

struct powernode wl[20];

struct linedata

{

int i;

int j;

float r;

float x;

float y; /*包括變壓器變比*/

float k; /*只用作標析變壓器,變壓器變比仍在y中*/

};

struct linedata zl[20];

struct linedata t3; /*臨時數組*/

static double y[][3]; /*在matrixform中應用*/

int t=0;

int t2,ti,tj; /*臨時記數單元*/

float temp;

float tx,tr,YK; /*中間工作單元(在matrixform中應用)*/

double GIJ,BIJ; /*中間工作單元(在matrixform中應用)*/

int N; /*總節點數*/

int zls;

int Q,V,PVS,PVD;

int GS;

int LS;

float vo;

float Eps;

static double GII[]={0},BII[]={0},YDS[]={0},YDZ[]={0},B[]={0};/*添加數組*/

/*因子表形成時定義的數據*/

struct pvdata

{

float vis;

int i;

};

static struct pvdata pv[]={0};

datain()

{

clrscr();

printf("program runningn" );

printf("n");

printf("please input the aggregate to the system note");/*總節點數*/

scanf("%d",&N);

printf("n");

printf(" PQ note IN ALL?");/*總節點數*/

scanf("%d",&Q);

PVS=(N-Q)-1;

printf("n");

printf("them input the aggregate to the system power line");

scanf("%d",&zls);/*輸電線路數和變壓器的總數*/

printf("n");

printf("electromotor node in all :?");/*發電機節點總數*/

scanf("%d",&GS);

printf("n");

printf("load node in all : ?");/*負荷節點總數*/

scanf("%d",&LS);

printf("n");

printf("average electric voltage");/*平均電壓*/

scanf("%f",vo);

printf("n");

printf("n");

printf("please input the date messagen");

printf("follow the format like it: i,j,r,x,y,kn");

do{

t++;

scanf("%d,%d,%f,%f,%f",&zl[t].i,&zl[t].j,&zl[t].r,&zl[t].x,&zl[t].y,&zl[t].k);

printf("processing....n");

if(zl[t].i>zl[t].j)

{

temp=zl[t].i;

zl[t].i=zl[t].j;

zl[t].j=temp;

/* if(zl[t].k!=1) */ /*要考慮歸算問題不????*/

}

printf("data you input is:n " );

printf("%d,%d,%f,%f,%f",zl[t].i,zl[t].j,zl[t].r,zl[t].x,zl[t].y,zl[t].k);

}while(zl[t].i!=0&&zl[t].j==0);

for(t2=t;t>0;t--) /*冒泡法排序*/

{

for(;t2>0;t2--)

{

if(zl[t2].i<zl[t2-1].i)

{

t3.i=zl[t2].i;t3.j=zl[t2].j;t3.r=zl[t2].r;t3.x=zl[t2].x;t3.y=zl[t2].y;t3.k=zl[t2].k;

zl[t2].i=zl[t2-1].i;zl[t2].j=zl[t2-1].j;zl[t2].r=zl[t2-1].r;zl[t2].x=zl[t2-1].x;zl[t2].y=zl[t2-1].y;zl[t2].k=zl[t2-1].k;

zl[t2-1].i=t3.i;zl[t2-1].j=t3.j;zl[t2-1].r=t3.r;zl[t2-1].x=t3.x;zl[t2-1].y=t3.y;zl[t2-1].k=t3.k;

}

else if(zl[t2].i==zl[t2-1].i)

{if(zl[t2].j<zl[t2-1].j)

{

t3.i=zl[t2].i;t3.j=zl[t2].j;t3.r=zl[t2].r;t3.x=zl[t2].x;t3.y=zl[t2].y;t3.k=zl[t2].k;

zl[t2].i=zl[t2-1].i;zl[t2].j=zl[t2-1].j;zl[t2].r=zl[t2-1].r;zl[t2].x=zl[t2-1].x;zl[t2].y=zl[t2-1].y;zl[t2].k=zl[t2-1].k;

zl[t2-1].i=t3.i;zl[t2-1].j=t3.j;zl[t2-1].r=t3.r;zl[t2-1].x=t3.x;zl[t2-1].y=t3.y;zl[t2-1].k=t3.k;

}

}

}

}

printf("n");

t=0;

printf("please input wg~!n");

do

{

scanf("%f,%f,%d,%f",&wg[t].pi,&wg[t].qi,&wg[t].i,&wg[t].vi);

t++;

}while(t!=GS);ti=0;

for(t=0;t<GS;t++){if(wg[t].vi<o){pv[ti].vis=labs(wg[t].vi);pv[ti].i=wg[t].i;ti++;}}

t2=0;

printf("please input WL~!n");

do

{

scanf("%f,%f,%d,%f",&wl[t2].pi,&wl[t2].qi,&wl[t2].i,&wl[t2].vi);

t2++;

}while(t2!=LS);

for(t=0;t<LS;t++){if(wl[t].vi<o){pv[ti].vis=labs(wl[t].vi);pv[ti].i=wl[t].i;ti++;}}

}

matrixform()

{

for(t=1;t<N;t++)

{

GII[t]=0;

BII[t]=0;

YDS[t]=0;

}

for(t2=1;t<zls;t2++)

{

ti=labs(zl[t2].i);

tj=labs(zl[t2].j);

tr=zl[t2].r;

tx=zl[t2].x;

temp=ldexp(tr,1)+ldexp(tx,1);

GIJ=tr/temp; BIJ=tx/temp;

y[t2][1]=-GIJ;

y[t2][2]=-BIJ;

y[t2][3]=tj;

GII[ti]=GII[ti]+GIJ; BII[ti]=BII[ti]+BIJ;

GII[tj]=GII[tj]+GIJ; BII[tj]=BII[tj]+BIJ;

YDS[ti]=YDS[ti]+1;

}

YDZ[1]=1;

for(t=1;t<N-1;t++)

{

YDZ[t+1]=YDZ[t]+YDS[t];

} /*矩陣型成第一部完成*/

/*矩陣型成第二部開始*/

for(t2=1;t<zls;t2++)

{ /*.k只用作變壓器的標析,變壓器變比仍在y中*/

ti=zl[t2].i;tj=zl[t2].j;YK=zl[t2].y;

if(ti<0||tj<0)

{ if(ti<0)

ti=labs(ti);

else

ti=labs(tj);

GIJ=y[t2][1];BIJ=y[t2][2];

GII[t2]=GII[t2]+(1-1/YK/YK)*GIJ;

BII[t2]=BII[t2]+(1-1/YK/YK)*BIJ;

y[t2][1]=GIJ/YK;

y[t2][2]=BIJ/YK;

}

else

GIJ=0;

BIJ=YK/2;

SY(tr); /*這個東東要調用,實現節點累計自導納*/

SY(tj); /*SY的過程是完成向一個節點累計相應自導納的實部和虛部*/

}

}

int sign,ld,k2,x,im,ai; /*k2控制台開關,負荷靜態特性開關*/

static float fd[]={0};

unsigned AF[1];

static int u[]={0}; /*???????????怎麼實現?來自那裡???????*/

divisorform()

{

/*暫時不知道LD PVD 等的作用……待善*/

PVD=pv[0].i;

ld=wl[0].i;

t=0;

do{

t2++;

if(sign==1&&t2==PVD)

{t=t+1;pvd=pv[t].i;fd[t2]=0;di[t2]=0;

if(k2==0&&t2==ld)

{t2=t2+1;ld=wl[t2].i;}

}continue;

else

B[t2]=BII[t2];

if(k2==0&&sing==1&&t2==ld)

{

B[t2]=B[t2]+AF[1]*wl[t2].qi/wl[t2].vi/wl[t2].vi;t2=t2+1;ld=wl[t2].i;

}

for(temp=YDZ[t2];temp<YDZ[t2+1]-1;temp++)

{

tj=Y[temp][3];B[tj]=Y[temp][2];

}

if(sign=1)

{for(temp=1;temp<PVS;temp++)

tj=pv[temp][2];

B[tj]=0;

}

x=2;im=1;

do{im++;

if(im>t2-1)

break;

else

temp=1;

for(;temp!>fd[im];){if(u[x+1]!=1){temp=temp+1;x=x+2;}else ai=u[x]/} /*u[]未完成*/

continue;

}

}while(t2!=N-1);

}

dataout()

{

clrscr();

printf("note 1 voltagen");

printf("(.639696730300784) + j (1.832939) = 1.94136001255537 ∠ 70.7609880529659°n");

printf("87u& 婾[1]??u?孢???�u

--------------------------------------------------------------------------------
??虍鉧C&8u謤蛝髻??n");

}

main()

{

datain(); /*數據輸入及處理*/

matrixform(); /*矩陣的形成*/

/* divisorform(); */ /*因子表的形成*/

matrixsolve(); /*矩陣線形方程的求解*/

/* nodepower(); */ /*迭代過程中節點功率的計算*/

/* iterate(); */ /*迭代*/

dataout(); /*數據輸出及支路功率計算*/

}

❺ c語言矩陣計算.急!

樓上的回答有問題,運行的時候不輸入運算符就直接列印"沒有注冊這個運算符號"了,並且運算結果也沒有列印出來.我做了下修改.下面是程序:
#include<stdio.h>
void add(int a[][2],int b[][2],int c[][2])
{
int i,j;
for(i=0;i<2;i++)
{for(j=0;j<2;j++)
{c[i][j]=a[i][j]+b[i][j];
printf("%d\t",c[i][j]); }
printf("\n");}
}
void minus(int a[][2],int b[][2],int c[][2])
{
int i,j;
for(i=0;i<2;i++)
{for(j=0;j<2;j++)
{c[i][j]=a[i][j]-b[i][j];
printf("%d\t",c[i][j]); }
printf("\n");}
}
void multiplication(int a[][2],int b[][2],int c[][2])
{
int i,j;
for(i=0;i<2;i++)
{for(j=0;j<2;j++)
{c[i][j]=a[i][j]*b[i][j];
printf("%d\t",c[i][j]); }
printf("\n");}
}

main()
{
int a[2][2],b[2][2],c[2][2],i,j;
char p;
puts("input 2*2 array--A:\n");
for(i=0;i<2;i++)
for(j=0;j<2;j++)
scanf("%d",&a[i][j]);
puts("input 2*2 array--B:\n");
for(i=0;i<2;i++)
for(j=0;j<2;j++)
scanf("%d",&b[i][j]);
puts("input operation:\n");
getchar();
p=getchar();
//scanf("%c",&p);
if(p=='+') add(a,b,c);else
if(p=='-') minus(a,b,c);else
if(p=='*') multiplication(a,b,c);else
puts("沒有注冊這個運算符號\n");
}

運行結果已經通過VC++6.0,並且結果正確.

❻ c語言計算矩陣行列式問題

簡化代碼,宏定義後,後面的程序直接拿來用就可以了

❼ C語言中的矩陣是怎樣計算的

矩陣的表示使用二維數組,當然二維數組通常情況下是不可以動態分配的,因此最好已開始定義一個足夠大的數組來存放矩陣元素。至於加減乘逆等運算,主要是利用嵌套循環操作其單個元素,由於每個人的方法不一樣就不詳細說了。希望對你有所幫助。

❽ 用c語言計算矩陣加法和乘法

謝謝你的回答,但是我看完你這個還有一個問題,你這里k i都是<2,而j<3,那意思不不就是每組數都被捨去了 兩個數么,還是說矩陣乘法就是這樣的規則,說實話我對矩陣乘法確實不了解了.

❾ c語言編寫,計算一矩陣的特徵值,按從大到小排序輸出。

#include<stdio.h>
int main()
{
int a[3][5],i,j,k,temp;

//通過讀取給3×5的數組賦值
for(i=0;i<3;i++)
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);

//一行一行的判斷
for(k=0;k<3;k++)
{
//標准冒泡法
for (j = 0; j < 9; j++)
{
for (i = 0; i < 9 - j; i++)
{
if (a[k][i] < a[k][i + 1])
{
temp = a[k][i];
a[k][i] = a[k][i + 1];
a[k][i + 1] = temp;
}
}
}
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
}

❿ C語言計算n階方陣的值

int a[N][N] = {1,2,3,4,5,6,8,7,9};
int iterx = 0, itery = 0;
int sum = 0;
for(iterx = 0; iterx < N; iterx++)
for(itery = 0; itery < N; itery++)
中間最主要的函數就是這樣的呢,注意函數名和結尾輸出的單位和准確度。
c語言作為比較普遍先進的一種電腦編程語言,具有很大的影響力和推動發展的作用。簡化了某些復雜的問題。