|
Forum studentów IV roku EiT Politechniki Śląskiej
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Zack de la Rocha
Dołączył: 10 Lis 2007
Posty: 187
Przeczytał: 0 tematów
|
Wysłany: Nie 15:56, 22 Mar 2009 Temat postu: Laborka nr 2 |
|
|
Jak ktos potrzebuje to skrypt do matlaba do 2 laborki:
Kod: | clc
clear
syms s k t
n = 25;
I1 = 1;
N1 = 1;
LN = 7;
LI = 9;
f = 100* (1 + (I1-N1)/10);
L = 10/f * (1 - (I1-N1)/10);
C = 1/(10^5 * f);
w0 = 2*pi*f;
T = 1 / f;
ti = 0;
fsin = 1200*(N1+I1);
XL = s*L;
XC = 1/(s*C);
R = 250;
Ku = ((XC * R) / (XC + R)) / (XL + (XC * R) / (XC + R));
disp('Funkcja transmitancji:');
disp(simplify(Ku));
disp('Wartosc symboliczna transmitancji:');
s = j*w0;
disp(subs(Ku));
%ustalic kolejnosc funkcji
f2 = N1/LN * sin(2*pi*fsin*t+pi/I1); %b
f4 = 0; %d
f1 = 200 * abs(N1 - 0.55 * I1) * (t - ti) - LN / (LI + LN); %a
f3 = 1/4 * (N1+I1); %c
c01 = 2/T * int(f1*Ku, t, 0, (1/4)*T);
c02 = 2/T * int(f2*Ku, t, (1/4)*T, T/2);
c03 = 2/T * int(f3*Ku, t, T/2, (3/4)*T);
c04 = 2/T * int(f4*Ku, t, (3/4)*T, T);
c0 = (c01 + c02 + c03 + c04)/2;
disp('Skladowa stala:');
disp(subs(c0));
for k = 1:n
e = exp(-j*k*w0*t);
ck1 = 2/T * int(f1*e*Ku, t, 0, (1/4)*T);
ck2 = 2/T * int(f2*e*Ku, t, (1/4)*T, T/2);
ck3 = 2/T * int(f3*e*Ku, t, T/2, (3/4)*T);
ck4 = 2/T * int(f4*e*Ku, t, (3/4)*T, T);
c = subs(ck1 + ck2 + ck3 + ck4);
amplituda = (sqrt(real(c)^2+imag(c)^2));
faza =atan(imag(c)/real(c));
if( real(c) < 0)
faza = faza + pi;
end
disp(sprintf('Harmoniczna: %d\nWynik: %f +%fi\nAmplituda: %f\nFaza: %f \n\n', k, real(c), imag(c), amplituda, faza*(180/pi)));
end
|
Jak sa jakies bledy to pisac
Ostatnio zmieniony przez Zack de la Rocha dnia Nie 23:51, 22 Mar 2009, w całości zmieniany 2 razy
|
|
Powrót do góry |
|
|
|
|
chmurli
Dołączył: 17 Gru 2007
Posty: 24
Przeczytał: 0 tematów
Skąd: /dev/null
|
Wysłany: Nie 17:18, 22 Mar 2009 Temat postu: |
|
|
chyba zle liczysz faze. w tym pragramie z pierwszej labki tez byla faza zle liczona. trzeba sprawdzac w ktorej cwiartce lezy liczba zespolona
Kod: |
clc
clear
syms s k t
n = 25;
N1 = 3;
I1 = 2;
LN = 6;
LI = 7;
f = 100* (1 + (I1-N1)/10);
L = 10/f * (1 - (I1-N1)/10);
C = 1/(10^5 * f);
w0 = 2*pi*f;
T = 1 / f;
ti = T/2;
fsin = 1200*(N1+I1);
XL = s*L;
XC = 1/(s*C);
R = 250;
Ku = ((XC * R) / (XC + R)) / (XL + (XC * R) / (XC + R));
disp('Funkcja transmitancji:');
disp(simplify(Ku));
disp('Wartosc symboliczna transmitancji:');
s = j*w0;
disp(subs(Ku));
%ustalic kolejnosc funkcji
f4 = N1/LN * sin(2*pi*fsin*t+pi/I1); %b
f2 = 0; %d
f3 = 200 * abs(N1 - 0.55 * I1) * (t - ti) - LN / (LI + LN); %a
f1 = 1/4 * (N1+I1); %c
c01 = 2/T * int(f1*Ku, t, 0, (1/4)*T);
c02 = 2/T * int(f2*Ku, t, (1/4)*T, T/2);
c03 = 2/T * int(f3*Ku, t, T/2, (3/4)*T);
c04 = 2/T * int(f4*Ku, t, (3/4)*T, T);
c0 = (c01 + c02 + c03 + c04)/2;
disp('Skladowa stala:');
disp(subs(c0));
for k = 1:n
e = exp(-j*k*w0*t);
ck1 = 2/T * int(f1*e*Ku, t, 0, (1/4)*T);
ck2 = 2/T * int(f2*e*Ku, t, (1/4)*T, T/2);
ck3 = 2/T * int(f3*e*Ku, t, T/2, (3/4)*T);
ck4 = 2/T * int(f4*e*Ku, t, (3/4)*T, T);
c = subs(ck1 + ck2 + ck3 + ck4);
amplituda = (sqrt(real(c)^2+imag(c)^2));
faza =atan(imag(c)/real(c));
if( real(c) > 0)
if( imag(c) > 0)
faza = subs(atan(abs(imag(c))/abs(real(c))));
end
if( imag(c) < 0)
faza = subs(-atan(abs(imag(c))/abs(real(c))));
end
end
if( real(c) <0> 0)
faza = subs(pi-atan(abs(imag(c))/abs(real(c))));
end
if( imag(c) <0> 90 )
faza=faza-180;
end
if( faza < -90 )
faza=faza+180;
end
disp(sprintf('Harmoniczna: %d\nWynik: %f +%fi\nAmplituda: %f\nFaza: %f \n\n', k, real(c), imag(c), amplituda, faza));
end |
Ostatnio zmieniony przez chmurli dnia Nie 17:19, 22 Mar 2009, w całości zmieniany 1 raz
|
|
Powrót do góry |
|
|
dominikk
Dołączył: 07 Sty 2009
Posty: 126
Przeczytał: 0 tematów
|
Wysłany: Nie 18:31, 22 Mar 2009 Temat postu: |
|
|
Funkcja transmitancji:
519460313115660973506560000/(170005193383307227693056*s+3863754395075163375*s^2+519460313115660973506560000)
chyba robię coś źle...
|
|
Powrót do góry |
|
|
Timon
Dołączył: 10 Paź 2007
Posty: 548
Przeczytał: 0 tematów
|
Wysłany: Nie 20:33, 22 Mar 2009 Temat postu: |
|
|
Jak to jest liczone? nie przypadkiem źle?
mnie sie zdaje że najpierw liczymy harmoniczne a dopiero później mnożymy przez Ku nie?
PS . A po za tym te KU jest inne dla każdej harmonicznej nie?
Ostatnio zmieniony przez Timon dnia Nie 20:42, 22 Mar 2009, w całości zmieniany 1 raz
|
|
Powrót do góry |
|
|
Zack de la Rocha
Dołączył: 10 Lis 2007
Posty: 187
Przeczytał: 0 tematów
|
Wysłany: Nie 21:06, 22 Mar 2009 Temat postu: |
|
|
Co do fazy to wydaje mi się, że na PE było coś takiego, że kiedy część rzeczywista jest mniejsza od 0 to wystarczy dodać poprawkę + PI, ale mogę się mylić. Zaraz poszukam w Bolkowskim.
Borys:
No masz racje,że powinno się zmieniać Ku dla częstotliwośc, ale z przemnażaniem nie masz racji, bo dla danej częstotliwości Ku to stała i nie ma znaczenia czy przemnożymy przed czy po całkowaniu
Trzeba w pętli dać:
s = j*w0*k;
I chyba będzie działać. Mam jeszcze tydzień do mojej laborki i za bardzo się w to nie wgłebiałem.
Ed.
Co do fazy to dobrze ją liczy, wystarczy dodać poprawkę gdy część rzeczywista jest ujemna:
[link widoczny dla zalogowanych]
Ostatnio zmieniony przez Zack de la Rocha dnia Nie 21:14, 22 Mar 2009, w całości zmieniany 2 razy
|
|
Powrót do góry |
|
|
chmurli
Dołączył: 17 Gru 2007
Posty: 24
Przeczytał: 0 tematów
Skąd: /dev/null
|
Wysłany: Nie 21:53, 22 Mar 2009 Temat postu: |
|
|
@Zack de la Rocha
EDIT:
niewazne juz
oba sposoby sa ok
tylko sie pomylilem w jednym fragmencie, poprawione:
Kod: | if( faza > 360 )
faza=faza-360;
end
if( faza < -360 )
faza=faza+360;
end |
Ostatnio zmieniony przez chmurli dnia Pon 1:32, 23 Mar 2009, w całości zmieniany 2 razy
|
|
Powrót do góry |
|
|
exti
Moderator
Dołączył: 14 Paź 2007
Posty: 353
Przeczytał: 0 tematów
Skąd: Zawiercie
|
Wysłany: Nie 23:52, 22 Mar 2009 Temat postu: |
|
|
Oczywiście na początku skryptu trzeba podstawić do zmiennej ti odpowiednią wartość, nie zawsze jest to T/2. Ściślej mówiąc, ti to miejsce, gdzie zaczyna się funkcja a, więc jeśli ktoś ma ją jako pierwszą, to musi dać ti=0.
|
|
Powrót do góry |
|
|
Timon
Dołączył: 10 Paź 2007
Posty: 548
Przeczytał: 0 tematów
|
Wysłany: Śro 22:38, 01 Kwi 2009 Temat postu: |
|
|
Jak już wrzucacie skrypty to zadbajcie chociaż aby były poprawnie liczone...
Kod: | clc
clear
syms s k t
n = 25;
N1 =
I1 =
LN =
LI =
ti =
f = 100* (1 + (I1-N1)/10);
L = (10/f) * (1 - (I1-N1)/10);
C = 1/(10^5 * f);
w0 = 2*pi*f;
T = 1 / f;
fsin = 1200*(N1+I1);
R = 250;
disp('Wartosc symboliczna transmitancji:');
disp('C:');
disp(subs(C));
disp('L:');
disp(subs(L));
%ustalic kolejnosc funkcji
f2 = N1/LN * sin(2*pi*fsin*t+pi/I1);
f4 = 0;
f1 = 200 * abs(N1 - 0.55 * I1) * (t - ti) - LN / (LI + LN);
f3 = 1/4 * (N1+I1);
c01 = 2/T * int(f1, t, 0, (1/4)*T);
c02 = 2/T * int(f2, t, (1/4)*T, T/2);
c03 = 2/T * int(f3, t, T/2, (3/4)*T);
c04 = 2/T * int(f4, t, (3/4)*T, T);
%NAJLEPIEJ WYWALIC TAM GDZIE JEST CALKA Z '0'
%c0 = (2/T)*(c01 + c02 + c03 + c04);
c0 = (2/T)*(c02 + c03 + c04);
disp('Skladowa stala:');
disp(subs(c0));
for k = 1:n
e = exp(-j*k*w0*t);
Kabs = abs(R/(((j*k*w0)^2)*R*L*C + (j*k*w0)*L + R));
ck1 = int(f1*e, t, 0, (1/4)*T);
ck2 = int(f2*e, t, (1/4)*T, T/2);
ck3 = int(f3*e, t, T/2, (3/4)*T);
ck4 = int(f4*e, t, (3/4)*T, T);
%NAJLEPIEJ WYWALIC TAM GDZIE JEST CALKA Z '0'
%c = (2/T)* subs(ck1 + ck2 + ck3 + ck4)*Kabs;
c =(2/T) * subs(ck2 + ck3 + ck4)*Kabs;
amplituda = abs(c);
b=((((j*k*w0)^2)*R*L*C + (j*k*w0)*L + R)/R);
f1 =atan(imag(c)/real(c))- atan(imag(b)/real(b)) ;
faza= f1;
if( real(c) < 0)
faza = faza + pi;
end
disp(sprintf('Harmoniczna: %d\nWynik: %f +%fi\nAmplituda: %f\nFaza: %f \n\n', k, real(c), imag(c), amplituda, faza*(180/pi)-90 ));
end |
Najlepiej jest sobie te dane od razu wklepac w domu i przeslac na serwer bo jak te dane bedziesz mial na kartce to moga byc niepotrzebne uciecia a liczba 0.00586827 różni się sporo od 0.006 także dokładność jest baardzo ważna w tym zadaniu. pzdro.[/code]
EDIT: kod poprawiony teraz sobie mozna kopiowac
Ostatnio zmieniony przez Timon dnia Czw 7:07, 02 Kwi 2009, w całości zmieniany 1 raz
|
|
Powrót do góry |
|
|
GREY
Dołączył: 07 Paź 2007
Posty: 634
Przeczytał: 0 tematów
Skąd: Żory/DS Ondraszek
|
Wysłany: Śro 23:38, 01 Kwi 2009 Temat postu: |
|
|
Przyganial kociol garnkowi.
Kod: | ??? Undefined function or variable 'Ku'.
Error in ==> borys at 25
disp(Ku); |
|
|
Powrót do góry |
|
|
Timon
Dołączył: 10 Paź 2007
Posty: 548
Przeczytał: 0 tematów
|
Wysłany: Czw 7:04, 02 Kwi 2009 Temat postu: |
|
|
No to usun ta linijke z Ku. ona i tak nie jest potrzebna. na koniec pousuwalem to co bylo zbedne, ale widocznie nie usunalem wszystkiego.
|
|
Powrót do góry |
|
|
zaix
Dołączył: 24 Lut 2008
Posty: 238
Przeczytał: 0 tematów
|
Wysłany: Czw 20:35, 02 Kwi 2009 Temat postu: |
|
|
Cytat: | c0 = (2/T)*(c02 + c03 + c04); |
No chyba w snach... po co mnozyc to drugi raz przez 2/T? Powinno byc raczej c0 = (c02 + c03 + c04)/2
|
|
Powrót do góry |
|
|
Zack de la Rocha
Dołączył: 10 Lis 2007
Posty: 187
Przeczytał: 0 tematów
|
Wysłany: Czw 20:57, 02 Kwi 2009 Temat postu: |
|
|
Przecież napisałem w pierwszym poście, że nie gwarantuję, że jest dobrze i proszę o sprawdzenie inne osoby? Nie wiem czemu sie napinasz
Mozesz skorzystac z funkcji angle(), ktora zwraca argument (kat fazowy) liczby zespolonej. Abs() zwraca moduł, ale tą funkcję już użyłeś.
Nie rozumiem tez dlaczego robisz modul z transmitacji. Nie bylem na ostatnim wykladzie i jezeli koles tak kazal robic to ok. Ja czegos takiego w zadnej ksiazce nei moglem znalezc.
A co do poprawnosci liczenia skryptu, to zaproksymowalismy sygnal za pomoca wyznaczonych przez niego wspolczynnikow i Grzechta powiedzial, ze wyglada to dobrze ale trzeba jeszcze pozmianiac ilosc probkowan w kazdym sygnale i powinno sie zgadzac. Tak to wyglada:
[link widoczny dla zalogowanych]
|
|
Powrót do góry |
|
|
Timon
Dołączył: 10 Paź 2007
Posty: 548
Przeczytał: 0 tematów
|
Wysłany: Pią 11:52, 03 Kwi 2009 Temat postu: |
|
|
To jakbyscie mieli z półką to by za takie wykres zjechałby was od góry do dołu przynajmniej mnie zjechał bo miałem podobnie... i powiedział że ten wykres aproksymowany to wcale nie podobny
|
|
Powrót do góry |
|
|
beer87
Dołączył: 21 Paź 2007
Posty: 249
Przeczytał: 0 tematów
|
Wysłany: Sob 11:49, 04 Kwi 2009 Temat postu: |
|
|
co do tego skryptu to wyskakuja mi takie błędy...
Cytat: | Warning: Divide by zero.
(Type "warning off MATLAB:divideByZero" to suppress this warning.)
> In D:\MATLAB6p5\work\zx.m at line 65
Harmoniczna: 4
Wynik: 0.000000 +0.000000i
Amplituda: 0.000000
Faza: NaN
??? Input argument 'NEWexpr' is undefined.
Error in ==> D:\MATLAB6p5\toolbox\symbolic\@sym\subs.m
On line 103 ==> error(inputchk(OLDf,OLDexpr,NEWexpr));
Error in ==> D:\MATLAB6p5\work\zx.m
On line 61 ==> c =(2/T) * subs(ck2 + ck3 + ck4)*Kabs;
| wiecie może o co kaman ?
|
|
Powrót do góry |
|
|
L3oN
Dołączył: 31 Paź 2007
Posty: 517
Przeczytał: 0 tematów
|
Wysłany: Nie 13:48, 05 Kwi 2009 Temat postu: |
|
|
Co do tego skryptu... nie zapomniał autor o tym, że wartość transmitancji filtru zmienia się z częstotliwością?
EDIT: tu moja, poprawiona wersja - wygląda na to, że dająca wyniki zgodne z prawdą: [link widoczny dla zalogowanych]
Podaje od razu fazy jakie trzeba wpisać do MCS (dla sinusów czyli +90 stopni)
Ostatnio zmieniony przez L3oN dnia Nie 16:00, 05 Kwi 2009, w całości zmieniany 2 razy
|
|
Powrót do góry |
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group deox v1.2 //
Theme created by Sopel &
Download
|