Liczby zespolone w języku C (cz.3)
Transkrypt
Liczby zespolone w języku C (cz.3)
Liczby zespolone w języku C (cz.1) Standard ISO C99 wprowadza wsparcie dla liczb zespolonych w języku C. Jest to realizowane przez wprowadzenie słów kluczowych _Complex i _Imaginary oraz nowych kwalifikatorów complex, _Complex_I, imaginary, _Imaginary_I. Mają one następujące znaczenie - complex – identyfikator służący definicji typu zespolonego - _Complex_I – identyfikator reprezentujący −1 - imaginary – identyfikator służący definicji typu urojonego - _Imaginary_I – identyfikator reprezentujący − 1 typu urojonego Nie wszystkie są obsługiwane przez przez kompilator DevC++. Obsługuje on _Complex, _Complex_I oraz complex ( jeśli włączono plik complex.h ) Plik ten umożliwia również stosowanie identyfikatora I jako −1 . Liczby zespolone w języku C (cz.2) Przykład. Zapis liczb zespolonych w programie C. (zastosowanie I i _Complex_I) 3.0 +4.0 i 3.0+ 4.0 * I 3.0 +4.0 i 3.0+ 4.0 * _Complex_I Liczby zespolone w języku C (cz.3) Typy zespolone Przykłady definicji zmiennych typów zespolonych. float _Complex z1; // części rzeczywista i urojona są typu float float complex z2; double complex double _Complex z3; // części rzeczywista i urojona są typu double w[2]={ 1+2*I , -3+4*I};// definicja tablicy // long double _Complex z4; long double z5; complex z inicjalizacją Na wartościach typów zespolonych można wykonywać te same działania arytmetyczne co na typach rzeczywistych ( +,-,*,/) Liczby zespolone w języku C (cz.4) W C99 wprowadzono szereg arytmetycznych funkcji standardowych umożliwiających realizację różnego rodzaju operacji na danych zespolonych. Poniżej podano cztery wybrane funkcje: cabs() - oblicza wartość modułu liczby zespolonej carg() -oblicza kąt fazowy creal() - wyznacza część rzeczywistą liczby zespolonej cimag() - wyznacza część urojoną liczby zespolonej Oprócz tych funkcji istnieją specjalne konstrukcje, które umożliwiają wczytywanie liczb zespolonych jak również wyznaczanie części rzeczywistej i części urojonej. Wyrażenie __ real__ zmiennaZespolona reprezentuje część rzeczywistą zmiennej zmiennaZespolona ( __ to podwójne podkreślenie) Wyrażenie __ imag__ zmiennaZespolona reprezentuje część rzeczywistą zmiennej zmiennaZespolona Poniżej w programie zastosowano wczytywanie i drukowanie wartości zespolonych z użyciem tych konstrukcji. Liczby zespolone w języku C (cz.5) int main(int argc, char *argv[]){ double _Complex z1,z2;// pierwszy sposób definicji double complex z3,z4;// drugi sposób definicji double complex z5=100+200*I;// definicja z //inicjalizacją // Przypisywanie wartości liczbom zespolonym z1=2+3*_Complex_I;// 2+3i z2=4+6*I; // 4+6i z3=z1+z2; // sumowanie liczb zespolonych // podobnie odejmowanie, mnozenie i dzielenie printf("\n z5=%f+j%f",creal(z5),cimag(z5)); // funkcja creal(z) wyznacza część rzeczywistą liczby // zespolonej, a cimag(z) część urojoną. Liczby zespolone w języku C (cz.6) // wczytywanie liczby zespolonej i drukowanie printf("\n z1="); scanf("%lf %lf", &(__real__ z1),&(__imag__ z1)); // drukowanie liczby zespolonej (sposob 1) printf("\n z1=%lf %lf", creal(z1),cimag(z1)); // drukowanie liczby zespolonej (sposob 2) printf("\n z1=%lf %lf", __real__ z1,__imag__ z1); Liczby zespolone w języku C (cz.7) Przykład. Napisać program realizujący transformacje gwiazda-trójkąt i trójkąt-gwiazda dla zadanych impedancji wczytywanych z wejścia, wczytywać z klawiatury kierunek transformacji. 1 1 Z1 Z2 Z12 Z3 Z13 2 3 Z23 2 Z Z + Z 2 Z 3 + Z1Z 2 Z12 = 1 3 Z3 Z 23 = Z1Z 2 + Z1Z 3 + Z 2 Z 3 Z1 3 Z13 = Z1Z 2 + Z 2 Z 3 + Z1Z 3 Z2 Liczby zespolone w języku C (cz.8) Przykład. Napisać program obliczający prąd w obwodzie dla zadanego napięcia wejściowego i zadanych impedancji, następnie zmodyfikować program, tak aby dane były wprowadzane z klawiatury. i 3 6-j3 3+j2 120ej0 10+j2.5 ~ 10-j4 1 5-3j 3-j2 2 Liczby zespolone w języku C (cz.9) X ( jω ) K ( jω ) Y ( jω ) K ( jω ) = X ( jω ) K ( jω ) - transmitacja zespolona Y ( jω ) Liczby zespolone w języku C (cz.10) K ( jω ) = K ( jω ) ⋅ e K ( jω ) θ (ω ) jθ ( ω ) -charakterystyka amplitudowa -charakterystyka fazowa W decybelach 20 log K ( jω ) Liczby zespolone w języku C (cz.11) Przykład.Obliczanie charakterystyki amplitudowej filtru. #include <stdio.h> #include <stdlib.h> #include <complex.h> int main () { double complex z1,z2,z3; double complex p1,p2,p3,p4,K_jOmega; double absK_jOmega,absK_jOmega1; double Omega=0; int i; p1=-0.92+0.38*I;//sprzężone bieguny transmitancji p2=-0.92-0.38*I; p3=-0.38+0.92*I; p4=-0.38-0.92*I; Liczby zespolone w języku C (cz.12) // Obliczanie modulu charakterystyki amplitudowej for (i=0;i<200;i++) { K_jOmega=(Omega*I+p1)*(Omega*I+p2)\ *(Omega*I+p3)*(Omega*I+p4); K_jOmega=1/K_jOmega; // obliczanie absK_jOmega=20*log10(sqrt(creal(K_jOmega)*\ creal(K_jOmega)+cimag(K_jOmega)*cimag(K_jOmega))); // uzycie funkcji obliczajacej modul liczby zespolonej (drugi sposób) absK_jOmega=20*log10(cabs(K_jOmega));