求用MATLAB编程计算短路电流的程序
求用MATLAB计算短路电流的程序,因为在下目前在做毕业设计,才刚开始,不到一个星期据要写论文了,很发愁!谢谢大家的帮忙! 怎么没人回复啊,我 也想学习学习 我也要,不过不好找呢!!有个案例最佳喽! 怎么都这么懒呢,贴一个C++的吧:
题目:三相短路电流计算
初始条件:
如图所示电力系统,最大运行方式时,两个电源同时送电,变压器并联运行,忽略线路电阻,线路电抗0.4Ω/km。计算k1和k2点在最大运行方式时的三相短路电流。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.写出三相短路电流的计算方法;
2.用C或FORTRAN语言实现三相短路电流的计算程序;
3.调试程序并求出计算结果;
4.撰写计算方法原理、计算流程文档及设计说明书;
5.提供计算程序代码。
代码使用C++编写的,共有三个文件,请建立工程,一起编译。这是Plural.hpp
#ifndef PLURAL_HPP
#define PLURAL_HPP
//类名称:Plural
//方法:GetR,GetI,SetRI,SetR,SetI
//数据:m_pluralR,m_pluralI
class Plural
{
public:
Plural();
Plural(float pR, float pI);
~Plural();
float GetR() const;
float GetI() const;
void SetRI(float pR, float pI);
void SetR(float pR);
void SetI(float pI);
private:
float m_pluralR;
float m_pluralI;
};
//名称: 复数乘法,PluralMul(Plural plural1, Plural plural2)
//参数:复数plural1 plural2
//返回值:复数
Plural PluralMul(Plural plural1, Plural plural2);
//函数名:复数除法,运算浮点数除以复数
//参数:num,分子,是一个浮点数。den,分母,是一个复数
//返回值:结果的复数
Plural PluralDiv(float num, Plural den);
//函数名:复数求倒数
//参数:den,分母,是一个复数
//返回值:此复数的倒数
Plural PluralDiv(Plural plu);
//参数:mat为待变换的复数矩阵的数组名,n为阶数
//返回值:无
//说明 :变换后的结果依旧保存在mat中
void MatrixInv(Plural *mat, int n);
#endif
#include "plural.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//类名称:Plural
//方法:GetR,GetI,SetRI,SetR,SetI
//数据:m_pluralR,m_pluralI
Plural::Plural()
{
m_pluralR = 0;
m_pluralI = 0;
}
Plural::Plural(float pR, float pI)
{
m_pluralR = pR;
m_pluralI = pI;
}
Plural::~Plural(){}
float Plural::GetR() const
{
return m_pluralR;
}
float Plural::GetI() const
{
return m_pluralI;
}
void Plural::SetRI(float pR, float pI)
{
m_pluralR = pR;
m_pluralI = pI;
}
void Plural::SetR(float pR)
{
m_pluralR = pR;
}
void Plural::SetI(float pI)
{
m_pluralI = pI;
}
//名称: 复数乘法,PluralMul(Plural plural1, Plural plural2)
//参数:复数plural1 plural2
//返回值:复数
Plural PluralMul(Plural plural1, Plural plural2)
{
Plural result;
result.SetRI(plural1.GetR() * plural2.GetR() - plural1.GetI() * plural2.GetI(),plural1.GetR() * plural2.GetI() + plural1.GetI() * plural2.GetR());
return result;
}
//函数名:复数除法,运算浮点数除以复数
//参数:num,分子,是一个浮点数。den,分母,是一个复数
//返回值:结果的复数
Plural PluralDiv(float num, Plural den)
{
Plural result;
float k;
k = den.GetR() * den.GetR() + den.GetI() * den.GetI();
result.SetR(num*den.GetR()/k);
result.SetI(-1.0*num*den.GetI()/k);
return result;
}
//函数名:复数求倒数
//参数:den,分母,是一个复数
//返回值:此复数的倒数
Plural PluralDiv(Plural plu)
{
Plural result;
float k;
k = plu.GetR() * plu.GetR() + plu.GetI() * plu.GetI();
result.SetR(plu.GetR()/k);
result.SetI(-1.0*plu.GetI()/k);
return result;
}
//说明:以下3个函数组合用来求复数矩阵的逆。
double *inv(double *A,double *Ainv,int n);
void mulAB(double *A,double *B,double *C,int am,int an,int bm,int bn);
//参数:mat为待变换的复数矩阵的数组名,n为阶数
//返回值:无
//说明 :变换后的结果依旧保存在mat中
void MatrixInv(Plural *mat, int n);
//矩阵求逆。A为原矩阵,Ainv为求逆之后矩阵,n为阶数
double *inv(double *A, double *Ainv, int n)
{
int *is, *js, i, j, k, l, u, v;
double d, p;
for (i=0; i<n*n; i++)
*(Ainv+i) = *(A+i);
is = (int*)malloc(n*sizeof(int));
js = (int*)malloc(n*sizeof(int));
for (k=0; k<=n-1; k++)
{
d=0.0;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{
l = i*n+j;
p = fabs(Ainv);
if (p>d)
{
d = p;
is = i;
js = j;
}
}
if (d + 1.0 == 1.0)
{
free(is);
free(js);
return NULL;
}
if (is != k)
for (j=0; j<=n-1; j++)
{
u = k*n+j;
v = is * n + j;
p = Ainv;
Ainv = Ainv;
Ainv = p;
}
if (js != k)
for (i=0; i<=n-1; i++)
{
u = i * n + k;
v = i * n + js;
p = Ainv;
Ainv = Ainv;
Ainv = p;
}
l = k * n + k;
Ainv = 1.0 / Ainv;
for (j=0; j<=n-1; j++)
if (j != k)
{
u = k * n + j;
Ainv = Ainv * Ainv;
}
for (i=0; i<=n-1; i++)
if (i != k)
for (j=0; j<=n-1; j++)
if (j != k)
{
u = i * n + j;
Ainv = Ainv - Ainv * Ainv;
}
for (i=0; i<=n-1; i++)
if (i != k)
{
u = i * n + k;
Ainv = -Ainv * Ainv;}
}
for (k=n-1; k>=0; k--)
{
if (js!=k)
for (j=0; j<=n-1; j++)
{
u = k*n+j;
v = js * n + j;
p = Ainv;
Ainv = Ainv;
Ainv = p;
}
if (is != k)
for (i=0; i<=n-1; i++)
{
u = i * n + k;
v = i * n + is;
p = Ainv;
Ainv = Ainv;
Ainv = p;
}
}
free(is);
free(js);
return Ainv;
}
//参数:a为原矩阵,b为逆矩阵,c为结果。其他在此都为n
void mulAB(double *a, double *b, double *c, int am, int an, int bm, int bn)
{
int i, j, l, u;
if (an != bm)
{
printf("不能完成原矩阵和其逆矩阵矩阵相乘\n");
return;
}
for (i=0; i<am; i++)
for (j=0; j<bn; j++)
{
u=i*bn+j;
c=0.0;
for (l=0; l<an; l++)
c=c+a*b;
}
return;
}
//复数矩阵求逆。参数:mat为待求矩阵,n为阶数
void MatrixInv(Plural *mat,int n)
{
int i, j;
double pluralR, pluralI;
double *a = NULL, *b = NULL, *c = NULL;
double *resultR = NULL, *resultI = NULL;
Plural result;
for (i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
pluralR = mat.GetR();
pluralI = mat.GetI();
}
}
printf("原始矩阵为:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%10.4f + j%0.4f\t", (*pluralR),(*pluralI));
printf("\n");
}
a = (double*)malloc(n*n*sizeof(double));
b = (double*)malloc(n*n*sizeof(double));
c = (double*)malloc(n*n*sizeof(double));
resultR = inv(*pluralR,a,n);
resultI = inv(*pluralI,b,n);
if (resultI != NULL)
{
printf("\n求逆之后虚部是:\n");
if (n%2 == 0)
{
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
printf("%10.4f + j%0.4f\t", resultR==NULL? 0:resultR, resultI==NULL ? 0:resultI);
printf("\n");
}
}
else
{
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
printf("%10.4f + j%0.4f\t", resultR==NULL? 0:resultR, resultI==NULL ? 0:-1.0*resultI);
printf("\n");
}
}
// 测试所求实部逆矩阵
// mulAB(*pluralR,a,c,n,n,n,n);
// printf("\n\n求逆后原实部和现在的实部乘积是\n");
// for(i=0;i<n;i++)
// {
// for(j=0;j<n;j++)
// printf("%10.4f\t", c);
// printf("\n");
// }
// 测试用所求逆矩阵
// mulAB(*pluralI,b,c,n,n,n,n);
// printf("\n\n求逆之后原虚部和现在的虚部乘积是:\n");
// for (i=0; i<n; i++)
// {
// for (j=0; j<n; j++)
// printf("%10.4f\t", -1.0*c);
// printf("\n");
// }
}
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
mat.SetRI(resultR == NULL ? 0:resultR, resultI == NULL ? 0:resultI);
}
free(a);
free(b);
free(c);
}
#include <iostream>
#include "plural.hpp"
//#include "input.hpp"
using namespace std;
void NodInit()
{
float g1S, g1X, g2S, g2X, l1L, l1D, l2L, l2D, t1S, t1U, t2S, t2U;
cout << "请输入发电机G1的容量S(无穷大请输入0):";
cin >> g1S;
cout << "请输入发电机G1的电抗Xd(没有请输入0):";
cin >> g1X;
cout << endl << "******************************************" << endl << endl;
cout << "请输入发电机G2的容量S(无穷大请输入0):";
cin >> g2S;
cout << "请输入发电机G2的电抗Xd(没有请输入0):";
cin >> g2X;
cout << endl << "******************************************" << endl << endl;
cout << "请输入线路1的长度L(KM):";
cin >> l1L;
cout << "请输入线路1每千米电抗值:";
cin >> l1D;
cout << endl << "******************************************" << endl << endl;
cout << "请输入线路2的长度L(KM):";
cin >> l2L;
cout << "请输入线路2每千米电抗值:";
cin >> l2D;
cout << endl << "******************************************" << endl << endl;
cout << "请输入变压器T1的容量S(MVA):";
cin >> t1S;
cout << "请输入变压器T1的Uk%:";
cin >> t1U;
cout << endl << "******************************************" << endl << endl;
cout << "请输入变压器T2的容量S(MVA):";
cin >> t2S;
cout << "请输入变压器T2的Uk%:";
cin >> t2U;
}
int main()
{
NodInit();
Plural matrix2;
matrix2.SetRI(0,1);matrix2.SetRI(0,2);matrix2.SetRI(0,1);matrix2.SetRI(0,1);
matrix2.SetRI(0,2);matrix2.SetRI(0,1);matrix2.SetRI(0,3);matrix2.SetRI(0,2);matrix2.SetRI(0,1);
MatrixInv(*matrix2,3);
printf("\n1点短路电流是\n");
printf("%f + j%f",PluralDiv(matrix2).GetR(), PluralDiv(matrix2).GetI());
printf("\n2点短路电流是\n");
printf("%f + j%f",PluralDiv(matrix2).GetR(), PluralDiv(matrix2).GetI());
printf("\n3点短路电流是\n");
printf("%f + j%f",PluralDiv(matrix2).GetR(), PluralDiv(matrix2).GetI());
getchar();
return 0;
} 辛苦了!::sad::::shocked::::smile:: 看看有什么内容 来学习了。。。。。。。。。。。。。。。。。。。。。 应用的问题~~~~~~~~~~~~ 我要 啊 我要啊 顶起,未来将朝着这个方向发展