以下是我写的程序
#include <stdio.h>
#include<complex.h>
#include<math.h>
int main()
{
unsigned char i,j,p,q;
complex arr[3][2]={{60 ,0},{80 ,-120},{100, -240}};
complex fabcr[3][1]={60+0i,-40-69.2820i,-50+86.6025i};
complex fa012[3][1], D[3][1],B[3][1],Vbal[3][1];
complex Vpol[3][2];
complex sum,l;
complex A[3][3]={{1 , 1 , 1}, {1 ,-0.5+0.866i ,-0.5-0.866i}, {1 ,-0.5-0.866i, -0.5+0.866i}};
complex invA[3][3]= {{0.3333 - 0.0000i , 0.3333 + 0.0000i, 0.3333},
{0.3333 ,-0.1667 - 0.2887i, -0.1667 + 0.2887i},
{ 0.3333 + 0.0000i , -0.1667 + 0.2887i , -0.1667 - 0.2887i}};
complex a=-0.5+0.866i;
//a^2 =-0.5-0.866i
printf("%f +i %f \n %f %f",creal(a),cimag(a),cabs(a),(180/M_PI)*carg(a));
printf("\n line voltage fabcr \n\n");
for(i=0;i<3;i++)
{
for(j=0;j<1;j++)
{
printf( "%f +i %f ",creal(fabcr[i][j]),cimag(fabcr[i][j]));
}
printf("\n");
}
printf("\n A matrix \n\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf( "%f +i %f ",creal(A[i][j]),cimag(A[i][j]));
}
printf("\n");
}
printf("\ninvA matrix\n\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf( "%f +i %f ",creal(invA[i][j]),cimag(invA[i][j]));
}
printf("\n \n");
}
//matrix multiplication
for(p=0;p<3;p++)
{
sum=0;
for(q=0;q<3;q++)
{
l=fabcr[q][0]*A[p][q];
sum=sum+l;
}
printf("%f i %f \n", creal(sum),cimag(sum));
//fa012[p][1]=(1/3)*creal(sum)+i*(1/3)*cimag(sum);
fa012[p][0]=sum*0.33;
}
printf("\n symmetrical componenet fa012\n \n");
for(p=0;p<3;p++)
{
printf("%f i %f \n", creal(fa012[p][0]),cimag(fa012[p][0]));
}
D[0][0]=-fa012[0][0];
D[1][0]=0;
D[2][0]=-fa012[2][0];
printf("\n matrix D \n \n");
for(p=0;p<3;p++)
{
printf("%f i %f \n", creal(D[p][0]),cimag(D[p][0]));
}
printf("\n\nzero and negative sequence component in line voltage terms\n\n");
for(p=0;p<3;p++)
{
sum=0;
for(q=0;q<3;q++)
{
l=D[q][0]*invA[p][q];
sum=sum+l;
}
printf("%f i %f \n", creal(sum),cimag(sum));
//fa012[p][1]=(1/3)*creal(sum)+i*(1/3)*cimag(sum);
B[p][0]=sum*3;
}
printf("\n\nfinal balanced voltage \n\n") ;
for(p=0;p<3;p++)
{
Vbal[p][0]=fabcr[p][0]+B[p][0];
printf("\n %f i %f \n %f %f \n", creal( Vbal[p][0]),cimag(Vbal[p][0]),cabs(Vbal[p][0]),(180/M_PI)*carg(Vbal[p][0]));
}
printf("\n\n conversion to polar cordinates \n\n") ;
for(i=0;i<3;i++)
{
Vpol[i][0]= cabs(Vbal[i][0]);
Vpol[i][1]= (180/M_PI)*carg(Vbal[i][1]);
printf("%f %f \n",Vpol[i][0],Vpol[i][1] );
}
getch();
}
如果我想在keil中使用它,则显示错误。 请建议如何进行复杂的操作? 我还将complex.h和_mingw.h从devcpp include文件夹复制到了keil / c51 / inc文件夹。
答案 0 :(得分:0)
您需要做四件事来使用Keil uVision编译程序:
将开关--c99
添加到编译器参数中。原因是armcc
已发货
使用Keil uVision 4在* .c文件中使用C90模式,可以在调用armcc
时看到
没有参数的终端:
--c90 Switch to C mode (default for .c files)
将代码中complex
的所有出现更改为float complex
或
double complex
因为这些是C99中复杂数据类型的名称。还看
例如here。
-0.5+0.866i
等复数的定义不起作用。改变这些
到-0.5+0.866*I
。
制作您自己的PI
定义,因为它未在<math.h>
中定义
与armcc
。您可以使用例如
#define M_PI 3.1415926535897932384626433832795
在这些步骤之后,代码至少会编译。但是,还有一些问题:
您正在使用%f
输出复数值而不是行中的浮点数
printf("%f %f \n",Vpol[i][0],Vpol[i][1] );
由于Vpol[i][0]
是复数的大小,而Vpol[i][1]
是它的大小
参数,你也可以输出cabs(Vpol[i][0])
和creal(Vpol[i][1])
。
当然,将定义更改为float Vpol[3][2];
会更好
因为你只在这个数组中存储实际值。
函数getch()
可能不是<stdio.h>
的一部分,即您可能必须这样做
在链接之前提供您自己的实现。
(不是真正的“问题”)。永远不会使用变量arr
。
希望有所帮助!
#include <stdio.h>
#include <complex.h>
#include <math.h>
#define M_PI 3.1415926535897932384626433832795
int main()
{
unsigned char i,j,p,q;
float complex fabcr[3][1] = {60+0*I,-40-69.2820*I,-50+86.6025*I};
float complex fa012[3][1], D[3][1],B[3][1],Vbal[3][1];
float Vpol[3][2];
float complex sum,l;
float complex A[3][3] = {{1, 1, 1},
{1, -0.5+0.866*I, -0.5-0.866*I},
{1, -0.5-0.866*I, -0.5+0.866*I}};
float complex invA[3][3]
= {{0.3333 - 0.0000*I, 0.3333 + 0.0000*I, 0.3333},
{0.3333, -0.1667 - 0.2887*I, -0.1667 + 0.2887*I},
{0.3333 + 0.0000*I, -0.1667 + 0.2887*I, -0.1667 - 0.2887*I}};
float complex a = -0.5+0.866*I;
//a^2 =-0.5-0.866i
printf("%f +i %f \n %f %f", creal(a), cimag(a),
cabs(a), (180/M_PI) * carg(a));
printf("\n line voltage fabcr \n\n");
for(i=0; i<3; i++)
{
for(j=0; j<1; j++)
{
printf( "%f +i %f ",creal(fabcr[i][j]),cimag(fabcr[i][j]));
}
printf("\n");
}
printf("\n A matrix \n\n");
for(i=0; i<3; i++)
{
for(j=0;j<3;j++)
{
printf( "%f +i %f ",creal(A[i][j]),cimag(A[i][j]));
}
printf("\n");
}
printf("\ninvA matrix\n\n");
for(i=0; i<3; i++)
{
for(j=0;j<3;j++)
{
printf( "%f +i %f ",creal(invA[i][j]),cimag(invA[i][j]));
}
printf("\n \n");
}
// matrix multiplication
for(p=0; p<3; p++)
{
sum=0;
for(q=0; q<3; q++)
{
l=fabcr[q][0]*A[p][q];
sum=sum+l;
}
printf("%f i %f \n", creal(sum),cimag(sum));
// fa012[p][1]=(1/3)*creal(sum)+i*(1/3)*cimag(sum);
fa012[p][0]=sum*0.33;
}
printf("\n symmetrical component fa012\n \n");
for(p=0; p<3; p++)
{
printf("%f i %f \n", creal(fa012[p][0]),cimag(fa012[p][0]));
}
D[0][0] = -fa012[0][0];
D[1][0] = 0;
D[2][0] = -fa012[2][0];
printf("\n matrix D \n \n");
for(p=0; p<3; p++)
{
printf("%f i %f \n", creal(D[p][0]),cimag(D[p][0]));
}
printf("\n\nzero and negative sequence component in line voltage terms\n\n");
for(p=0; p<3; p++)
{
sum=0;
for(q=0; q<3; q++)
{
l=D[q][0]*invA[p][q];
sum=sum+l;
}
printf("%f i %f \n", creal(sum),cimag(sum));
//fa012[p][1]=(1/3)*creal(sum)+i*(1/3)*cimag(sum);
B[p][0]=sum*3;
}
printf("\n\nfinal balanced voltage \n\n") ;
for(p=0; p<3; p++)
{
Vbal[p][0] = fabcr[p][0]+B[p][0];
printf("\n %f i %f \n %f %f \n",
creal(Vbal[p][0]), cimag(Vbal[p][0]),
cabs(Vbal[p][0]), (180/M_PI) * carg(Vbal[p][0]));
}
printf("\n\n conversion to polar cordinates \n\n") ;
for(i=0; i<3; i++)
{
Vpol[i][0] = cabs(Vbal[i][0]);
Vpol[i][1] = (180/M_PI) * carg(Vbal[i][1]);
printf("%f %f \n", Vpol[i][0], Vpol[i][1]);
}
}