当前位置:首页 » 编程语言 » 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语言作为比较普遍先进的一种电脑编程语言,具有很大的影响力和推动发展的作用。简化了某些复杂的问题。