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));