複素数演算(1)〜伝達関数〜  

問題:次の伝達関数の、s=ωiにおける周波数応答(振幅、位相)を求めよ。
      
               s+3
       H(s)= ------------
             s^2+3s+2 




/*2kadai2.c*/

#include<stdio.h>
#include<math.h>

/*複素数の定義(構造体)*/
typedef struct COMPLEX{
double r,i;
}complex;

complex Comp(r,i)
double r,i;
{
complex z;
z.r=r;
z.i=i;
return z;
}

/*複素数の和を定義*/
complex Cadd(x,y)
complex x,y;
{
complex z;
z.r=x.r+y.r;
z.i=x.i+y.i;
return z;
}

/*複素数の差を定義*/
complex Csub(x,y)
complex x,y;
{
complex z;
z.r=x.r-y.r;
z.i=x.i-y.i;
return z;
}

/*複素数の積を定義*/
complex Cmul(x,y)
complex x,y;
{
complex z;
z.r=x.r*y.r-x.i*y.i;
z.i=x.i*y.r+x.r*y.i;
return z;
}


/*複素数の除算を定義*/
complex CDiv(x,y)
complex x,y;
{
complex z;
double r,q;
if(fabs(y.r)>=fabs(y.i)){
r=y.i/y.r;
q=y.r+r*y.i;
z.r=(x.r+r*x.i)/q;
z.i=(x.i-r*x.r)/q;
}else{
r=y.r/y.i;
q=y.i+r*y.r;
z.r=(x.r*r+x.i)/q;
z.i=(x.i*r-x.r)/q;
}
return z;
}

main(){

double s1,A,x,X,i;
complex s,r1,r2,r3,r4,a,b,c,d,e,f,g,h,H;

printf("sの値を入力してください。\n");
printf("ただしs=ωiの形で表せるものとして、ωにあたる部分を入力してください。");
s.r=0;
scanf("%lf",&s.i);
r1=Comp(1.0,0.0);
r2=Comp(2.0,0.0);
r3=Comp(3.0,0.0);
r4=Comp(4.0,0.0);
a=Cadd(s,r3);
b=Csub(s,r1);
c=Csub(s,r2);
d=Cmul(s,s);
e=Csub(d,r1);
f=Csub(d,r4);
g=Cmul(Cmul(a,b),c);
h=Cmul(e,f);
H=CDiv(g,h);
i=H.r*H.r+H.i*H.i;
A=pow(i,0.5);
x=H.i/H.r;
X=atan(x);

printf("このsに対する周波数応答は\n");
printf("振幅・・・%lf \n",A);
printf("位相・・・%lf \n",X);
printf("となります。\n");
}

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送