沙茉 发表于 2009-4-30 11:10:30

求用MATLAB编程计算短路电流的程序

求用MATLAB计算短路电流的程序,
因为在下目前在做毕业设计,才刚开始,不到一个星期据要写论文了,很发愁!谢谢大家的帮忙!

dzhfanglei 发表于 2009-5-7 22:37:12

怎么没人回复啊,我 也想学习学习

renqhui 发表于 2009-5-11 14:17:10

我也要,不过不好找呢!!有个案例最佳喽!

leerhu 发表于 2009-5-23 08:49:20

怎么都这么懒呢,贴一个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;
}

nomad0728 发表于 2009-7-14 10:32:54

辛苦了!::sad::::shocked::::smile::

xwen0203 发表于 2010-4-29 17:33:39

看看有什么内容

sunyanguo 发表于 2010-5-9 08:48:35

来学习了。。。。。。。。。。。。。。。。。。。。。

^_^ 发表于 2010-5-19 08:55:48

应用的问题~~~~~~~~~~~~

yxl360 发表于 2010-5-26 10:02:44

我要 啊 我要啊

biny1984 发表于 2010-5-30 20:10:24

顶起,未来将朝着这个方向发展
页: [1] 2 3
查看完整版本: 求用MATLAB编程计算短路电流的程序

招聘斑竹